我必须为一个非常老的Linux系统编译一个简单的二进制文件。我在目标计算机上没有可用的gcc / build库,但可以访问该计算机。
我无法在自己的计算机上编译代码并无法在目标计算机上执行代码。
我正在将libc.so复制到我的本地计算机上,并尝试编译并链接该程序,以便它将在目标计算机上执行。
我已将libc从目标计算机复制到我的计算机,并尝试使用目标可执行文件进行编译。
这已经接近成功执行:
gcc -nostdlib ./libc-[version].so myFile.c -emain -o outfile.out
在执行时,会运行一个非常简单的PoC测试程序,然后在退出时对故障进行隔离。实际程序只是将故障隔离。
似乎我对链接有些缺乏了解。有帮助吗?
答案 0 :(得分:0)
似乎我对链接有些缺乏了解。
您知道。 “普通”用户级程序不会从main
开始执行,而是从_start
开始。
_start
符号通常来自crt0.o
文件(libc的一部分),并且知道如何在内核提供参数的方式和main
期望的方式之间“接口”找到他们。它还会初始化运行main
之前必须初始化的各种数据(例如stdio
流)。
然后您要做的是:
gcc main.o
执行的实际链接命令。您可以通过添加-v
标志来实现。crt0.o
和其他输入文件,适当的。使用与您的目标匹配的OS(以及针对它的旧工具)来启动VM并在该VM中构建程序可能更容易。
否则,您可能必须设置完整的交叉编译器环境(其中包括libc和所需的所有其他库)。这不是一个简单的命题,并且肯定不能通过从目标计算机复制libc.so
来实现。但是它是 well-documented,并且肯定是可行的(有一定技巧)。