为 2.4.0 内核、i586 架构构建二进制文件(telnet)

Posted

技术标签:

【中文标题】为 2.4.0 内核、i586 架构构建二进制文件(telnet)【英文标题】:Build binary (telnet) for 2.4.0 kernel, i586 architecture 【发布时间】:2017-03-09 08:04:06 【问题描述】:

我正在尝试交叉编译二进制文件以在旧的 Linux 发行版(内核 2.4.25、i586 架构)上使用。

我采取的步骤

我已经下载了landley i586交叉编译器(http://landley.net/aboriginal/downloads/binaries/) 我下载了net-utils源:https://ftp.gnu.org/gnu/inetutils/ 1.9.4版 我在路径中包含了交叉编译器:export PATH=/root/Documents/cross-compiler-i586/bin/:$PATH 然后我构建了 telnet 二进制文件如下:LDFLAGS=”-static" ./configure --host=i586 --build=x86_64 --target=i586 --disable-ifconfig --with-ncurses-include-dir=/root/Documents/tnbuild --disable-hostname --disable-logger --disable-rcp --disable-rexec --disable-rlogin --disable-rsh --disable-tftp --disable-traceroute --disable-inetd --disable-rexecd --disable-syslogd --disable-tftpd 成功编译,并使用 file 命令检查(剥离后)二进制文件:telnet: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped

我将它与旧 Linux 系统上已经存在的二进制文件进行了比较,输出完全相同:ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter lib/ld-linux.so.2, for GNU/Linux 2.4.0, stripped

我面临的问题

我编译的 telnet 二进制文件不能在旧的 Linux 系统上运行。抛出的错误只是“分段错误”。谷歌搜索这个错误得知它可能是由于架构的差异(i586?),但我不知道如何修复它,因为“文件”命令输出的工作二进制文件和失败的二进制文件完全相同.

然后我偶然发现了这个话题:GCC Cross compile to a i586 architecture (Vortex86DX),但由于它没有被追求,我不确定我是否真的应该为 i586 编译所有工具链以及我需要如何做。

【问题讨论】:

放入GDB。这可能会为失败的位置提供线索。加载时可能会失败(任何共享库?)。可能是在加载配置、属性(如果有的话)时失败。 Strace 也会给你提示。 @blackpen,谢谢,但我忘了提到目标系统上没有安装 GDB。所以我看不到它失败的地方,除非我能够先安装 gdb.. 你有 strace 吗?您可能能够看到它在哪个系统调用中失败。 您也可以尝试 LD_DEBUG=all telnet。这会转储来自动态链接器的调试输出。您将能够看到可能从错误路径加载的库。您也可以尝试 ldd telnet 查看正在使用的共享库列表(及其路径),如 man page 所示。 如果是 redhat/centos,您也许可以指向 /etc/yum.repos.d/*repo 文件中的归档 repo。对于 centos,vault.centos.org/2.1/final/i386/CentOS/RPMS(但我找不到 2.4 的路径)。 【参考方案1】:

您是否有特定的原因要交叉编译它而不是仅仅为通用 32 位 i386 编译?如果 CPU 不支持某些编译器优化,您可能需要禁用它们,但您可能不需要创建静态链接的二进制文件。

These instructions 用于编译 32 位 (-m 32) 似乎足以创建 telnet 二进制文件。

他们归结为:

apt-get install gcc-multilib;
./configure CFLAGS='-m32' -disable-ifconfig \
    --with-ncurses-include-dir=/root/Documents/tnbuild  \
    --disable-hostname --disable-logger --disable-rcp \
    --disable-rexec --disable-rlogin --disable-rsh \
    --disable-tftp --disable-traceroute --disable-inetd \
    --disable-rexecd --disable-syslogd --disable-tftpd
make

【讨论】:

@Michael - 可以尝试将“-O0”添加到 CFLAGS 以防止编译器优化?

以上是关于为 2.4.0 内核、i586 架构构建二进制文件(telnet)的主要内容,如果未能解决你的问题,请参考以下文章

Mono 本机二进制包无法在较新的 Linux 内核中加载 libc

[架构之路-28]:目标系统 - 系统软件 - Linux OS内核功能架构图解内核构建内核启动流程

为不同的架构重建静态库

用于构建 OpenCV 的 OpenCL 内核错误生成

编译linux内核2.4.0时内联汇编错误

在 /dev 文件上设置 root-only 权限并构建二进制文件