在Linux下使用不同的glibc库编译C程序

3

我有一个基于Linux的防火墙设备,它具有glibc-2.3.4,但没有gcc来编译该程序。 当我在另一台Linux机器上编译程序时,错误消息显示:

需要 glibc.x.x.x

我该如何在另一台Linux机器上为该版本的glibc编译C程序?


有一个类似的问题:http://stackoverflow.com/questions/2071325/relink-a-shared-library-to-a-different-version-of-libc。 - Sadeq
2个回答

2
通常你需要使用包含所有目标库及其所需或兼容版本的适当构建环境。libc变体之间的区别不仅在于链接库名称本身。例如,所需的配置文件可能不同。一些接口可以通过头级内联包装器提供,在版本之间发生变异。通常情况下,使用更新的库版本运行二进制文件是安全的,但使用旧版本则不安全。
但是,如果您在系统上额外安装了目标libc的开发包,则可以直接使用-nostdinc和-nostdlib开关(或显式调用链接器)以及明确指定所需库来构建二进制文件。您可以从gcc -v输出中获取示例。对于我的系统,它的最终链接器命令如下:
/usr/bin/ld --eh-frame-hdr -V -dynamic-linker /libexec/ld-elf.so.1 \ -o t /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o \ -L/usr/lib -L/usr/lib /tmp//ccCb5j33.o -lgcc --as-needed -lgcc_s \ --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed \ /usr/lib/crtend.o /usr/lib/crtn.o
根据目标libc的特定要求,您应该将其中一些指令替换为另一些指令。特别是,启动(crt1.o和crti.o)、清理(crtend.o、crtn.o)、libc本身(明确路径而非-lc)都应进行替换;可选地,同样应满足动态链接器。
P.S. 我看到这是一个太老的问题了,但它现在刚刚被重新编辑了 :)

1

apbuild-apgcc 工具设置了与旧版本的 glibc 符号进行链接的环境。


这是非常好的答案,但我想使用内核2.6.13及更高版本中的inotify,但是由于apgcc,我无法使用它。 - hamSh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接