为什么不将外部变量添加到 .dynsym table?

Why aren't external variables added to .dynsym table?

根据我对 .dynsym 的理解,它应该包含应该从外部程序可见的符号。我尝试了一个包含这一行的简单程序:

extern int global = 1000;

我以为可执行文件会在其 .dynsym 中包含 global 符号,但事实并非如此。我对这部分的理解有误吗?

I thought the executable would contain the global symbol in its .dynsym

你为什么这么想?

默认情况下,只有参与 link 的一些其他共享库引用的符号才会从 executable.

的动态符号 table 中导出

您可以使用 --export-dynamic linker 标志强制在动态符号 table 中导出 所有 符号:

$ cat foo.c
int global = 1000;
int main() { return 0; }

$ gcc foo.c && nm -D a.out | grep global
# no output

$ gcc foo.c -Wl,--export-dynamic && nm -D a.out | grep global
0000000000004028 D global