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

时间:2010-08-15 11:17:19

标签: linux gcc compiler-construction glibc

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

  

需要glibc.x.x.x

如何在另一台linux机器上为该版本的glibc编译一个c程序?

2 个答案:

答案 0 :(得分:1)

apbuild-apgcc工具设置了与旧版glibc符号链接的内容。

答案 1 :(得分:1)

通常,您必须使用适当的构建环境,其中包含具有所需或兼容版本的所有目标库。 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。我认为这是一个太老的问题,但它刚刚被重新编辑:)