Linux 在较新系统上构建较旧的GLIBC
我有一个问题,我希望这里的一些专家能帮助我:)我的目标很简单:(目标1)在较新的系统上构建较旧的glibc,(目标2)构建可以在较旧的glibc上运行的旧软件。我使用的是gcc4.9、glibc2.19、amd64系统。我确实在我的系统上编译了glibc2.14和gcc4.7.3 (约定:Linux 在较新系统上构建较旧的GLIBC,linux,gcc,compilation,glibc,Linux,Gcc,Compilation,Glibc,我有一个问题,我希望这里的一些专家能帮助我:)我的目标很简单:(目标1)在较新的系统上构建较旧的glibc,(目标2)构建可以在较旧的glibc上运行的旧软件。我使用的是gcc4.9、glibc2.19、amd64系统。我确实在我的系统上编译了glibc2.14和gcc4.7.3 (约定:/path/to/libc2.14_dir=$LIBC214,/path/to/gcc4.7.3=$GCC473) 我正在尝试使用新构建的glibc2.14编译bash4.2.53(以及其他软件coreutil
/path/to/libc2.14_dir=$LIBC214
,/path/to/gcc4.7.3=$GCC473
)
我正在尝试使用新构建的glibc2.14编译bash4.2.53
(以及其他软件coreutil、binutil、qt3.3…)。我的configure和make如下所示:(我在object/build目录中)
在bash4.2.53构建(对象)目录中完成make时,我尝试了两种方案:
场景1。使用系统的libc2.19
$ ldd ./bash
linux-vdso.so.1 (0x00007ffe677c3000)
libtinfo.so.5 => $MY_PREBUILT_NCURSE/lib/libtinfo.so.5 (0x00007f5d108e3000)
libdl.so.2 => $LIBC214/lib/libdl.so.2 (0x00007f5d106df000)
libc.so.6 => $LIBC214/lib/libc.so.6 (0x00007f5d10354000)
$LIBC214/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f5d10b0a000)
这行很奇怪:$LIBC214/lib/ld-linux-x86-64.so.2=>/lib64/ld-linux-x86-64.so.2(0x00007f5d10b0a000)
场景2。将$LIBC214/bin添加到我的路径中,$LIBC214/lib添加到我的LD_LIBRARY_路径中
$ ldd ./bash
/bin/bash: $LIBC214/lib/libc.so.6: version `GLIBC_2.15' not found (required by /bin/bash)
$ export SHELL=$PWD/bash
$ ldd --version
/bin/bash: $LIBC214/lib/libc.so.6: version `GLIBC_2.15' not found (required by /bin/bash)
$ ldd ./bash
/bin/bash: $LIBC214/lib/libc.so.6: version `GLIBC_2.15' not found (required by /bin/bash)
据我所知,SCENARIO2是运行命令的正确方式。我的假设是,我错误地构建了glibc2.14,它使用了/bin/bash
,后者反过来又使用了glibc2.19。我不是很确定
我的问题:
谢谢。链接ELF时,ldso的绝对路径会硬编码在其中。如果要使用另一个,可以使用该标志覆盖它。但是,此路径是绝对路径,因此如果您尝试将本地glibc移动到其他地方,您链接的ELF将无法执行(出现错误,如
没有此类文件
)。这是无法避免的,因为系统在设计上必须有一条通向目标的绝对路径
之所以得到奇怪的而不是动态可执行文件
输出,是因为ldd
通过实际执行目标ELF并提取(通过调试挂钩)加载的库来工作。因此,当您尝试使用像这样的diffldd
时,glibc会感到困惑。如果您想要一个稳定的依赖项LIST,您可以从项目中考虑“代码> LDDTruts<代码>(大多数DistROS现在已经绑定)。或者直接在文件上运行readelf-d
,查看所需的所有dtu
条目
试图构建和维护自己的工具链(glibc、gcc等)是一个巨大的麻烦。除非你想花很多时间在这上面,否则你真的应该用一个像这样的项目来为你管理它。这将允许您使用较旧的glibc构建完整的工具链,然后您可以使用它来构建任意您喜欢的随机包
如果你真的想花时间手工完成这一切,你应该参考for and then。1段:我在上面的
$make中确实做了。第三+第四段:我确实花了大约50+个小时在这上面。沿途锯过横杆。我去看看。非常感谢。啊,还有一个问题。我找到了Gentoo前缀。您是否推荐它而不是crosstool ng?Gentoo Prefix通常使用预先存在的主机工具链,而不是构建自己的交叉编译器集。但如果您使用crosstool ng制作了一个,您可能会幸运地使用该工具链制作Gentoo前缀。
$ $LIBC214/bin/ldd ./bash
not a dynamic executable
$ ldd ./bash
/bin/bash: $LIBC214/lib/libc.so.6: version `GLIBC_2.15' not found (required by /bin/bash)
$ export SHELL=$PWD/bash
$ ldd --version
/bin/bash: $LIBC214/lib/libc.so.6: version `GLIBC_2.15' not found (required by /bin/bash)
$ ldd ./bash
/bin/bash: $LIBC214/lib/libc.so.6: version `GLIBC_2.15' not found (required by /bin/bash)