针对特定平台的交叉编译——链接 libc
Cross-compiling for a specific platform -- linking libc
我必须为一个非常旧的 Linux 系统编译一个简单的二进制文件。我在目标机器上没有可用的 gcc/build 库,但我可以访问该机器。
我在我的机器上编译代码并让它在目标机器上执行时遇到问题。
我正在将 libc.so 复制到我的本地计算机并尝试编译和 link 程序,以便它可以在目标计算机上执行。
我已经将 libc 从目标机器复制到我的机器上,并尝试用我的目标可执行文件编译它。
这已经接近成功执行:
gcc -nostdlib ./libc-[version].so myFile.c -emain -o outfile.out
执行时运行一个非常简单的 PoC 测试程序,然后在退出时出现段错误。实际程序只是段错误。
看来我对linking 还是有些不了解。有帮助吗?
It seems I have somewhat of a lack of understanding of linking.
是的。 "normal" 用户级程序不会从 main
开始执行,而是从 _start
.
开始执行
_start
符号通常来自 crt0.o
文件(libc 的一部分),并且知道如何 "interface" 在内核提供参数的方式和 main
期望找到它们。它还会初始化在 main
运行之前必须初始化的各种数据(例如 stdio
流)。
那你要做的是:
- 找出
gcc main.o
执行的实际 link 命令。您可以通过添加 -v
标志来实现。
- 复制这样的命令,提供
crt0.o
和其他输入文件,适合 适合您的目标 libc 版本。
使用 OS 匹配您的目标(以及针对它的旧工具)启动 VM 并在该 VM 内部构建您的程序可能会更容易。
否则,您可能必须设置一个完整的交叉编译器环境(其中包括 libc 和您需要的所有其他库)。这 不是 一个微不足道的命题,当然不是通过从目标机器上复制 libc.so
来完成的。但它 是 well-documented 并且肯定是可行的(需要一些技巧)。
我必须为一个非常旧的 Linux 系统编译一个简单的二进制文件。我在目标机器上没有可用的 gcc/build 库,但我可以访问该机器。
我在我的机器上编译代码并让它在目标机器上执行时遇到问题。
我正在将 libc.so 复制到我的本地计算机并尝试编译和 link 程序,以便它可以在目标计算机上执行。
我已经将 libc 从目标机器复制到我的机器上,并尝试用我的目标可执行文件编译它。
这已经接近成功执行:
gcc -nostdlib ./libc-[version].so myFile.c -emain -o outfile.out
执行时运行一个非常简单的 PoC 测试程序,然后在退出时出现段错误。实际程序只是段错误。
看来我对linking 还是有些不了解。有帮助吗?
It seems I have somewhat of a lack of understanding of linking.
是的。 "normal" 用户级程序不会从 main
开始执行,而是从 _start
.
_start
符号通常来自 crt0.o
文件(libc 的一部分),并且知道如何 "interface" 在内核提供参数的方式和 main
期望找到它们。它还会初始化在 main
运行之前必须初始化的各种数据(例如 stdio
流)。
那你要做的是:
- 找出
gcc main.o
执行的实际 link 命令。您可以通过添加-v
标志来实现。 - 复制这样的命令,提供
crt0.o
和其他输入文件,适合 适合您的目标 libc 版本。
使用 OS 匹配您的目标(以及针对它的旧工具)启动 VM 并在该 VM 内部构建您的程序可能会更容易。
否则,您可能必须设置一个完整的交叉编译器环境(其中包括 libc 和您需要的所有其他库)。这 不是 一个微不足道的命题,当然不是通过从目标机器上复制 libc.so
来完成的。但它 是 well-documented 并且肯定是可行的(需要一些技巧)。