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

时间:2019-10-07 15:41:44

标签: gcc linker cross-compiling

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

我无法在自己的计算机上编译代码并无法在目标计算机上执行代码。

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

我已将libc从目标计算机复制到我的计算机,并尝试使用目标可执行文件进行编译。

这已经接近成功执行:

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

在执行时,会运行一个非常简单的PoC测试程序,然后在退出时对故障进行隔离。实际程序只是将故障隔离。

似乎我对链接有些缺乏了解。有帮助吗?

1 个答案:

答案 0 :(得分:0)

  

似乎我对链接有些缺乏了解。

您知道。 “普通”用户级程序不会从main开始执行,而是从_start开始。

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

然后您要做的是:

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

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

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