我为链接器提供了我的文件:ld-2.7.so,libc-2.7.so和crt1.o但是无法成功编译。是否可以链接到默认的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
答案 0 :(得分:2)
我发现了怎么做:
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
答案 1 :(得分:1)
正如@onemasse所说,你还需要与该版本的libc兼容的头文件。在glibc版本之间,事情仍然有效,但这不能依赖。
否则,我建议您在启动新库之前使用export LD_PRELOAD_PATH到其他libc的任何位置。
但你真正想要的是在Linux中进行交叉编译,对于linux,还有另一个libc。 看看crosstool。
答案 2 :(得分:0)
如果要链接到系统提供的libc以外的其他libc,还需要使用与该版本的libc兼容的头文件编译程序。
另外,我不熟悉“-dynamic-linker”选项。它不在gcc的手册页中。我真的无法解决你想要做的事情。
也许你应该尝试这个并从那里开始工作:
gcc -ldl program.c -o program
您通常不必明确链接“libc”或“crt1.o”。