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

标签 linux gcc compiler-construction glibc

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

require glibc.x.x.x

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

最佳答案

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

但是,如果您在系统中额外安装了目标 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)应该被替换;可选地,同样应该满足动态链接器。

附言我看到这个问题太老了,但它刚刚被重新编辑过:)

关于linux - 使用不同的 glibc 库在 Linux 中编译 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3487128/

相关文章:

c - 快速调用 GCC 示例

c++ - 用于用 C++ 编写的编译器的树解析器

c# - 使用 .NET 3.5 和 C# 从文件在运行时编译 IL 代码

linux - Unix 基于分号对行进行排序

linux scp/sftp命令

linux - 内存在 32 位系统中未使用?

Linux 内核错误

c - 重写 GCC 内联汇编以不需要 volatile 或内存破坏

c - 函数声明对于 C 编程来说是必不可少的吗?

java - 如何匹配 CUP 解析器语法中的空大小写