【问题标题】:Compile C program in Linux with different glibc library使用不同的 glibc 库在 Linux 中编译 C 程序
【发布时间】:2010-08-15 11:17:19
【问题描述】:

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

需要 glibc.x.x.x

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

【问题讨论】:

标签: linux gcc compiler-construction glibc


【解决方案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)应该被替换;可选地,同样应该满足动态链接器。

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

【讨论】:

    【解决方案2】:

    apbuild-apgcc 工具设置了链接到旧版本的 glibc 符号。

    【讨论】:

    • 这是一个很好的答案,但我想使用 inotify 它在内核 2.6.13 及更高版本中,但使用 apgcc 我不能使用它。
    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多