全局变量的 C ld 链接时错误

标签 c linker ld

我正在阅读《计算机系统:程序员的视角》,我发现了以下 C 文件:

Foo.c:

void f(void);

int x = 15213;
int y = 15212;

int main()
{
    f();
    printf("x = 0x%x y = 0x%x \n", x, y);
    return 0;
}

条形图:

double x;
void f()
{
    x = -0.0;
}

使用 gcc -o foobar foo.c bar.c 编译并给出以下输出:

 x = 0x0 y = 0x80000000

哇。因此,由于 int 是 4 个字节,而 double 是 8 个字节(无论如何在我的系统上)并且 x 的强符号在 Foo.c 中,x 被分配了 -0.0 的十六进制表示,这反过来也覆盖了 y!

所以我想了解更多这方面的信息。为什么标准的 C 类型安全措施在这里不起作用? 0x0000000080000000是不是盲目写到ELF中存放x的地方,y恰好在旁边被覆盖了?请尽可能详细。

最佳答案

你有没有注意到,当你编译的时候,这个警告就来了。

/usr/bin/ld: Warning: alignment 4 of symbol `x' in /tmp/cciNZgVG.o is smaller than 8 in /tmp/cc8pYw6O.o

这是未定义的行为。不要忽视警告。它会根据您分配的值生成答案。

关于全局变量的 C ld 链接时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29471626/

相关文章:

c - snprintf 的隐式声明

c - 从 RAM ARM Cortex M4 执行

c - 通过 AS 的 incbin 指令包含的字符串上的 NULL 终止符

c++ - C 和 C++ 之间的条件运算符差异

c - 在 C 中的多个函数之间传递不同的值?

linux - 如何设置二进制文件的运行路径?

c++ - 在 Eclipse 中将 Boost 链接到我的 C++ 项目

c - LD_PRELOAD 在我的代码中是如何工作的

linux - LD_LIBRARY_PATH 未链接库

c - 定义函数指针数组的正确方法是什么?