【问题标题】:GCC -nostdlib fails with undefined reference to `__libc_csu_fini'GCC -nostdlib 失败,未定义对 `__libc_csu_fini' 的引用
【发布时间】:2010-11-04 16:44:13
【问题描述】:

我向链接器提供了我的文件:ld-2.7.so、libc-2.7.so 和 crt1.o,但它未能成功编译。是否可以链接到与默认 glibc 不同的 glibc?

(静态编译或安装单独的 glibc 不是一个选项。)

gcc -Wl,-dynamic-linker,ld-2.7.so,libc-2.7.so,crt1.o -nostdlib program.c

crt1.o: In function `_start':  
(.text+0x12): undefined reference to `__libc_csu_fini'  
crt1.o: In function `_start':  
(.text+0x19): undefined reference to `__libc_csu_init'  
/tmp/user/1000/ccauFlwt.o: In function `findsize':  
program.c:(.text+0x21): undefined reference to `stat'  
/tmp/user/1000/ccauFlwt.o: In function `findtime':  
program.c:(.text+0x4c): undefined reference to `stat'  
collect2: ld returned 1 exit status  

【问题讨论】:

  • 在黑暗中刺探:您可以尝试在命令行中列出两次库:-Wl,-dynamic-linker,ld-2.7.so,libc-2.7.so,crt1.o,ld-2.7.so,libc-2.7.so,crt1.o。
  • __libc_csu_init 和 fini 可能是其他 crt*.o 文件中的一些 C++ 构造函数/析构函数垃圾,即使对于 C 程序,glibc crt1.o 也无用地想要引入。您可以尝试找到使其工作的东西,或者只是拆解crt1.o(它很小)并将其替换为您自己的不做任何垃圾的版本。
  • 直接使用ld时相同:stackoverflow.com/questions/6656317/…

标签: c gcc


【解决方案1】:

我发现了怎么做:

rpath 指定提供的库的位置。此文件夹应包含:libc.so.6、libdl.so.2、libgcc_s.so.1 甚至更多。使用 strace 检查您的二进制文件使用了哪些库。

ld.so 是提供的链接器

gcc -Xlinker -rpath=/default/path/to/libraries -Xlinker -I/default/path/to/libraries/ld.so program.c

【讨论】:

    【解决方案2】:

    正如@onemasse 所说,您还需要与该版本的libc 兼容的头文件。虽然在 glibc 版本之间仍然可以正常工作,但这不能依赖。

    否则,我建议您在启动新库之前使用 export LD_PRELOAD_PATH 到您的其他 libc 所在的任何位置。

    但你真正追求的是在 linux 中交叉编译,对于 linux,但使用另一个 libc。 看看crosstool。

    【讨论】:

      【解决方案3】:

      如果您想链接到系统提供的 libc 以外的另一个 libc,您还需要使用与该版本 libc 兼容的头文件来编译程序。

      另外,我不熟悉“-dynamic-linker”选项。它不在 gcc 的手册页中。我真的不知道你想做什么。

      也许你应该试试这个,然后从那里开始工作:

      gcc -ldl program.c -o program
      

      您通常不必显式链接到“libc”或“crt1.o”。

      【讨论】:

        猜你喜欢
        • 2011-10-03
        • 2016-10-15
        • 2017-08-11
        • 2018-05-07
        • 2017-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多