Linux 在较新系统上构建较旧的GLIBC

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

我有一个问题,我希望这里的一些专家能帮助我:)我的目标很简单:(目标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、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。我不是很确定

我的问题:

  • 你能为我解释一下上面的奇怪的一行和下面的一行,它们不是一个动态的可执行文件

  • 你能和我分享一下你正确构建glibc(目标1)和使用glibc(目标2)构建软件的步骤吗

  • 接下来我可以做什么来解决上述2个场景


  • 谢谢。

    链接ELF时,ldso的绝对路径会硬编码在其中。如果要使用另一个,可以使用该标志覆盖它。但是,此路径是绝对路径,因此如果您尝试将本地glibc移动到其他地方,您链接的ELF将无法执行(出现错误,如
    没有此类文件
    )。这是无法避免的,因为系统在设计上必须有一条通向目标的绝对路径

    之所以得到奇怪的
    而不是动态可执行文件
    输出,是因为
    ldd
    通过实际执行目标ELF并提取(通过调试挂钩)加载的库来工作。因此,当您尝试使用像这样的diff
    ldd
    时,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)