针对特定平台的交叉编译——链接 libc

Cross-compiling for a specific platform -- linking libc

我必须为一个非常旧的 Linux 系统编译一个简单的二进制文件。我在目标机器上没有可用的 gcc/build 库,但我可以访问该机器。

我在我的机器上编译代码并让它在目标机器上执行时遇到问题。

我正在将 libc.so 复制到我的本地计算机并尝试编译和 link 程序,以便它可以在目标计算机上执行。

我已经将 libc 从目标机器复制到我的机器上,并尝试用我的目标可执行文件编译它。

这已经接近成功执行:

gcc -nostdlib ./libc-[version].so myFile.c -emain -o outfile.out

执行时运行一个非常简单的 PoC 测试程序,然后在退出时出现段错误。实际程序只是段错误。

看来我对linking 还是有些不了解。有帮助吗?

It seems I have somewhat of a lack of understanding of linking.

是的。 "normal" 用户级程序不会从 main 开始执行,而是从 _start.

开始执行

_start 符号通常来自 crt0.o 文件(libc 的一部分),并且知道如何 "interface" 在内核提供参数的方式和 main 期望找到它们。它还会初始化在 main 运行之前必须初始化的各种数据(例如 stdio 流)。

那你要做的是:

  1. 找出 gcc main.o 执行的实际 link 命令。您可以通过添加 -v 标志来实现。
  2. 复制这样的命令,提供 crt0.o 和其他输入文件,适合 适合您的目标 libc 版本。

使用 OS 匹配您的目标(以及针对它的旧工具)启动 VM 并在该 VM 内部构建您的程序可能会更容易。

否则,您可能必须设置一个完整的交叉编译器环境(其中包括 libc 和您需要的所有其他库)。这 不是 一个微不足道的命题,当然不是通过从目标机器上复制 libc.so 来完成的。但它 well-documented 并且肯定是可行的(需要一些技巧)。