Gcc 针对特定平台的交叉编译--链接libc
我必须为一个非常旧的Linux系统编译一个简单的二进制文件。我在目标计算机上没有可用的gcc/build lib,但我确实可以访问该计算机 在我的机器上编译代码并在目标机器上执行时遇到问题 我正在将libc.so复制到我的本地机器上,并尝试编译和链接程序,以便它在目标机器上执行 我已将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 在
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
标志来执行此操作crt0.o
和其他输入文件libc.so
来实现的。但它确实是可行的(需要一些技巧)