小编Dav*_*idG的帖子

64位函数返回32位指针

这个函数被埋在一个复杂的嵌套中,所以实际上找到原因可能超出我能提出的任何要求,但我想知道是否有人可能能够提供一些关于我如何进行调试的提示.这是我遇到问题的代码的要点

//func1.c
somestruct* func1(somestruct* mystruct)
{
    printf("func1: %p, %i\n", mystruct, mystruct->foo);
    return mystruct;
}
//func2.c
somestruct* func1(somestruct* mystruct);
void func2()
{
    somestruct *mystruct = malloc(sizeof(somestruct));
    mystruct->foo = 10;
    printf("func2: %p, %i\n", mystruct, mystruct->foo);
    mystruct = func1(mystruct);
    printf("back in func2: %p\n", mystruct);
    free(mystruct);
}
Run Code Online (Sandbox Code Playgroud)

我叫func2.输出是这样的

func2: 0x7f38a00008c0, 10
func1: 0x7f38a00008c0, 10
back in func2: 0xffffffffa00008c0
(SEGFAULT trying to free 0xffffffffa00008c0)
Run Code Online (Sandbox Code Playgroud)

实际代码更复杂,"mystruct"在许多其他地方传递也没有问题,函数在不同文件中的事实似乎可能是问题的一部分,是的,它需要返回指针(返回的指针不保证与输入指针相同).对我来说,它有点(但实际上并没有)被截断为32位,然后在顶部填充ffffffff,这似乎很奇怪.

在32位机器上编译时,它的工作原理完全正常.

我在某处考虑过内存损坏,所以我通过valgrind运行它.Valgrind报告没有错误,实际上导致它成功完成.教科书heisenbug.至少我可以使用GDB.

有没有人知道可能导致这种情况的原因,或者至少我如何开始追查问题?

c 64-bit pointers

9
推荐指数
1
解决办法
2742
查看次数

强制 C 文件中的所有数据位于 .text(或其他)部分

我正在使用 gcc 编译 ARM Cortex-M4F 微控制器的一些代码。我的应用程序使用大量数据,我已将这些数据方便地写入 C 文件中:大型整数和浮点数组、指向各种数组、各种结构的循环链表,诸如此类。

当我编译它时,它总共有大约 500K 的数据,加上实际应用程序的几百 K 数据。gcc 将所有这些数据方便地放入 .data 部分;然后 ld 尝试构建 elf,将 .data 部分放入 RAM,将 .text(代码)部分放入 FLASH。我使用的 MCU 没有 500K RAM,因此无法构建 ELF,但它有 1M FLASH。我尝试更改我的链接器脚本,以便将 .data 和 .text 都放入“有效”的 FLASH 中,但还有一些其他代码希望其数据进入 RAM,因此最终执行失败;我无法做出如此彻底的改变。

我需要的是告诉 gcc 将这个 C 文件中的每个对象放入 .text 部分,以便它可以与其余的不可变内容一起进入 FLASH,或者至少是我可以指示我的链接器的其他部分编写如何处理的脚本,以便它不会干扰在 RAM 中安装没有问题的现有 blob。我不知道该怎么做。这是我所拥有的一个非常精简的例子

/* data.c */
static char* option_array_0_0[] =
{
    "O=0.40",
    "K=FOO",
    "JAR=JAR",
};

static int width_array_0_0[] =
{
    0,
    1,
    1,
};

Window window_array_0[] =
{
    {
        option_array,
        width_array,
    },
};

/* …
Run Code Online (Sandbox Code Playgroud)

c microcontroller linker gcc ld

6
推荐指数
2
解决办法
2万
查看次数

标签 统计

c ×2

64-bit ×1

gcc ×1

ld ×1

linker ×1

microcontroller ×1

pointers ×1