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

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

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

我在计算机上编译代码并使其在目标计算机上执行时遇到麻烦。

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

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

这已经接近成功执行:

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

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

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

gcc linker cross-compiling
1个回答
0
投票

似乎我有点缺乏对链接的理解。

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

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

然后您想要做的是:

  1. 找出gcc main.o执行的实际链接命令。您可以通过添加-v标志来实现。
  2. 复制此命令,为您的目标libc版本提供crt0.o和其他输入文件,适当。>>
  3. [与目标匹配的操作系统(以及针对它的旧工具)启动虚拟机,并在该虚拟机内部构建程序可能更容易。

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

well-documented肯定是可行的(有一定技巧)。
© www.soinside.com 2019 - 2024. All rights reserved.