为什么不将外部变量添加到 .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
根据我对 .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