【问题标题】:Cross-compiling for a specific platform -- linking libc针对特定平台的交叉编译——链接 libc
【发布时间】:2020-02-04 22:44:24
【问题描述】:

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

我无法在我的机器上编译代码并让它在目标机器上执行。

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

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

这已经接近成功执行:

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

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

看来我对链接有点缺乏了解。有什么帮助吗?

【问题讨论】:

    标签: gcc linker cross-compiling


    【解决方案1】:

    看来我对链接有点缺乏了解。

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

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

    那么你想做的是:

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

    使用与您的目标相匹配的操作系统(以及针对它的旧工具)启动一个虚拟机,并在该虚拟机中构建您的程序可能会更容易。

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

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 2019-09-27
      • 1970-01-01
      • 2011-01-21
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 2015-05-25
      相关资源
      最近更新 更多