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

问题描述 投票:0回答:2

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

需要 glibc.x.x.x

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

linux gcc glibc
2个回答
2
投票

通常,您必须使用正确的构建环境,其中包含具有所需或兼容版本的所有目标库。 libc 变体之间的区别不仅仅在于链接库名称本身。例如,所需的配置文件可能不同。某些接口可以提供标头级内联包装器,这些包装器在版本之间会发生变化。使用较新的库版本运行二进制文件通常是安全的,但使用较旧的库版本则不然。

但是,如果您的系统中另外安装了目标 libc 的开发包,则可以使用 -nostdinc 和 -nostdlib 开关(或显式调用链接器)直接使用它构建二进制文件,并显式指定所需的库。该示例可以从

gcc -v
输出中获得。从我的系统来看,这是最终的链接器命令:

/usr/bin/ld --eh-frame-hdr -V -动态链接器 /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 \
  --不按需要-lc -lgcc --按需要-lgcc_s --不按需要\
  /usr/lib/crtend.o /usr/lib/crtn.o

根据目标 libc 的具体情况,您应该将其中一些指令替换为其他指令。特别是,启动(crt1.o和crti.o)、清理(crtend.o、crtn.o)、libc本身(显式路径而不是-lc)应被替换;可选地,同样应该满足动态链接器。

附注我发现这个问题太老了,但现在已经重新编辑了:)


1
投票

apbuild-apgcc 工具可将内容设置为链接到旧版本的 glibc 符号。

© www.soinside.com 2019 - 2024. All rights reserved.