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

Gcc 针对特定平台的交叉编译--链接libc,gcc,linker,cross-compiling,Gcc,Linker,Cross Compiling,我必须为一个非常旧的Linux系统编译一个简单的二进制文件。我在目标计算机上没有可用的gcc/build lib,但我确实可以访问该计算机 在我的机器上编译代码并在目标机器上执行时遇到问题 我正在将libc.so复制到我的本地机器上,并尝试编译和链接程序,以便它在目标机器上执行 我已将libc从目标机器复制到我的机器上,并尝试使用我的目标可执行文件编译它 这已接近成功执行: gcc-nostlib./libc-[version].so myFile.c-emain-o outfile.out 在

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

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

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

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

这已接近成功执行:

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

在执行时,运行一个非常简单的PoC测试程序,然后在退出时seg故障。实际程序只是简单地划分故障

似乎我对链接有点缺乏理解。有什么帮助吗

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

是的。“正常”用户级程序不会从
main
开始执行,而是从
\u start
开始执行

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

然后,您要做的是:

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

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