c - 使用外部指针声明外部函数时出错

标签 c assembly linker elf

根据我的理解,ELF 目标文件中的符号只是内存地址的名称。换句话说,给定符号名称,链接器应始终引用相同的地址,无论它们在 C 中声明什么类型。

我发现事实并非如此。请参阅下面的示例:

/* a.c */
extern void *foo;
extern void *bar;
void main() {
  printf("foo: %p, bar: %p\n", foo, bar)
}

/* b.c */
void foo(void) {
}
void bar(void) {
}

上述程序的输出显示 foobar 指向同一位置 (1)。而且这个位置与 foobar 的地址相去甚远。注(1)表示不可能不是转换错误

我尝试将 foobar 的类型修改为函数指针(例如 extern void (*foo)(void)),输出仍然相同。

当然,只要使用正确的声明extern void foo(void),它就可以工作。

我的理解有什么错误吗?谢谢。 (我正在努力纠正我的理解,而不仅仅是让事情顺利进行)

最佳答案

您没有打印符号foo的地址和bar引用,但是foo地址处的值和bar .

打印foo的地址和bar你需要做这样的事情:

extern void *foo;
extern void *bar;

void main() {
  printf("foo: %p, bar: %p\n", &foo, &bar);
}

关于c - 使用外部指针声明外部函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38342595/

相关文章:

c - 从类型 'char*[length] '(矩阵 + 结构)分配给类型 'char*' 时的类型不兼容

c - 参数少于指定的 sscanf?

assembly - 对于已知常量 AND 掩码,仅使用移位和旋转进行逻辑 AND

assembly - 关于汇编和计算机程序的问题

Linux 等效于 Windows DLL 转发器或 MacOS reexport_library

macos - mac os x 上的 Cmake,使用完整路径链接库

c - cortex-m0plus 上的浮点库

assembly - 部件8086中的图形模式

c - 更多 GCC 链接时间问题 : undefined reference to main

c - 尝试从内核空间将结构写入 proc 文件