【问题标题】:Can I compile a static application with a dynamic symbol table?我可以用动态符号表编译静态应用程序吗?
【发布时间】: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


【解决方案1】:

我认为可执行文件与 C 库静态链接的想法,但提供到共享库的导出可能是一个错误的概念。在这种情况下会发生什么?假设您的共享库分配了一些内存(使用它自己的 C 库副本),然后将其传递给可执行文件中的例程,该例程释放它(在 C 库的不同副本中)。这闻起来像个问题。如果您需要静态链接某些库,可以在这些库之前使用-Wl,-Bstatic 选项来强制链接静态版本。

此外,如果您需要对正在发生的事情进行更多控制,最好有单独的编译和链接步骤,并直接使用ld 进行链接步骤。它不一定对您正在使用的命令行选项有帮助,但我怀疑您可以找到“有效”的东西,除非出现上述问题。

【讨论】:

  • 谢谢。我问这个问题的核心原因是看看我是否可以修复并发布 Crosstool-NG 中静态 native-gdb 构建选项的补丁。就像你说的,从根本上说没有多大意义。一个功能齐全的 gdb 静态构建可以工作的唯一方法是将它链接到 thread_db 并删除 dlopen() 调用。
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 2011-07-12
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
相关资源
最近更新 更多