如何使用 Red Hat Developer Toolset 构建 32 位二进制文件?
How do I build 32-bit binaries with Red Hat Developer Toolset?
我找不到任何关于如何使用 Red Hat Developer Toolset(在本例中为版本 9.0 运行 在 CentOS 7 上)定位 32 位的文档。发行说明提到:
Generation and manipulation of 32-bit binaries is also supported
它还在以下位置提供了所需的 32 位库:
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/
但是,构建失败。尝试构建最小 int main() {}
程序的示例:
$ scl enable devtoolset-9 'g++ -m32 tst.cpp'
/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld: skipping incompatible /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++_nonshared.a when searching for -lstdc++_nonshared
/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld: cannot find -lstdc++_nonshared
collect2: error: ld returned 1 exit status
它找不到的库实际上存在:
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++_nonshared.a
没有多少 -L
标志可以修复它(无论如何这都是错误的解决方案;链接器甚至不应该尝试在 -m32
模式下加载 64 位库。)
我在这里错过了什么?
我猜你没有注意到 /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++_nonshared.a
很可能是一个悬挂的符号链接:
$ file /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++_nonshared.a
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++_nonshared.a: broken symbolic link to `../../../i686-redhat-linux/9/libstdc++_nonshared.a'
$
不幸的是,任何 CentOS 组件都没有提供目标文件 /opt/rh/devtoolset-9/root/usr/lib/gcc/i686-redhat-linux/9/libstdc++_nonshared.a
(但它应该在 devtoolset-9-libstdc++-devel.i686
中)。因此,这很可能是 CentOS 特定的打包错误,因为 RHEA-2019:4134 为 Red Hat Enterprise Linux 7 提供了被质疑的包 devtoolset-9-libstdc++-devel-9.1.1-2.6.el7.i686.rpm
,包括所需的文件(由 yum install /opt/rh/devtoolset-9/root/usr/lib/gcc/i686-redhat-linux/9/libstdc++_nonshared.a
在 RHEL 7 上明确验证).
我找不到任何关于如何使用 Red Hat Developer Toolset(在本例中为版本 9.0 运行 在 CentOS 7 上)定位 32 位的文档。发行说明提到:
Generation and manipulation of 32-bit binaries is also supported
它还在以下位置提供了所需的 32 位库:
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/
但是,构建失败。尝试构建最小 int main() {}
程序的示例:
$ scl enable devtoolset-9 'g++ -m32 tst.cpp'
/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld: skipping incompatible /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++_nonshared.a when searching for -lstdc++_nonshared
/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld: cannot find -lstdc++_nonshared
collect2: error: ld returned 1 exit status
它找不到的库实际上存在:
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++_nonshared.a
没有多少 -L
标志可以修复它(无论如何这都是错误的解决方案;链接器甚至不应该尝试在 -m32
模式下加载 64 位库。)
我在这里错过了什么?
我猜你没有注意到 /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++_nonshared.a
很可能是一个悬挂的符号链接:
$ file /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++_nonshared.a
/opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/32/libstdc++_nonshared.a: broken symbolic link to `../../../i686-redhat-linux/9/libstdc++_nonshared.a'
$
不幸的是,任何 CentOS 组件都没有提供目标文件 /opt/rh/devtoolset-9/root/usr/lib/gcc/i686-redhat-linux/9/libstdc++_nonshared.a
(但它应该在 devtoolset-9-libstdc++-devel.i686
中)。因此,这很可能是 CentOS 特定的打包错误,因为 RHEA-2019:4134 为 Red Hat Enterprise Linux 7 提供了被质疑的包 devtoolset-9-libstdc++-devel-9.1.1-2.6.el7.i686.rpm
,包括所需的文件(由 yum install /opt/rh/devtoolset-9/root/usr/lib/gcc/i686-redhat-linux/9/libstdc++_nonshared.a
在 RHEL 7 上明确验证).