【发布时间】:2012-09-11 10:05:23
【问题描述】:
举个简单的例子:
void foo() {}
int main()
{
return 0;
}
我构建它并查看动态符号表:
$ g++ test.cpp -o test
$ nm --dynamic test
0804849c R _IO_stdin_used
w __gmon_start__
U __libc_start_main
不出所料,我没有看到foo。所以我构建以包含未使用的符号。
$ gcc test.c -rdynamic -o test
$ nm --dynamic test
0804863c R _IO_stdin_used
w _Jv_RegisterClasses
0804a010 A __bss_start
0804a008 D __data_start
w __gmon_start__
080485e0 T __libc_csu_fini
08048570 T __libc_csu_init
U __libc_start_main
0804a010 A _edata
0804a018 A _end
0804861c T _fini
08048638 R _fp_hw
08048438 T _init
080484a0 T _start
0804a008 W data_start
08048554 T foo
08048559 T main
您可以看到foo 现在在符号表中。现在我构建一个静态版本。
$ gcc test.c -rdynamic -static -o test
$ nm --dynamic test
nm: test: No symbols
我的符号已经消失,即使我明确指定了它们。
根据 GCC 手册页:
-静态 在支持动态链接的系统上,这会阻止与共享库的链接。
我的函数foo() 不是共享库。
如果我扩展此应用程序,它调用dlopen(),而我加载的库需要调用foo(),我的符号表不再包含对foo() 的引用,我的应用程序将失败。
这发生在我身上recently。
为什么 -static 否定 -rdynamic 以及如何解决它?
【问题讨论】:
-
如果先编译:
gcc -c test.c -rdynamic -o test.o,然后调用gcc链接应用呢? -
-static和-rdynamic都是链接器的选项,所以它就变成了gcc test.o -rdynamic -static -o test。结果相同。 -
我的错误。在编译中用
-shared替换-rdynamic? -
当我深入查看 gcc 和 ld 的手册页时,我确实尝试过
-shared。它编译、链接和创建动态符号表,但应用程序段出错。 -
这里回答了克服 seg 错误的技巧:stackoverflow.com/questions/4963029/… 但这开始摆脱原来的问题了。
标签: gcc compiler-construction compilation linker