我可以在不重新编译glibc的情况下修改动态链接器并使用它吗?

我可以在不重新编译glibc的情况下修改动态链接器并使用它吗?,c,linux,compiler-construction,linker,glibc,C,Linux,Compiler Construction,Linker,Glibc,我试图在64位Ubuntu机器上修改libc6(2.15-0ubuntu20.2)中提供的动态链接器 因此,目前我的代码使用的是同一版本的glibc库。(我已经下载了相同的源代码并正在进行处理)。我的问题是,在不构建整个glibc库的情况下,是否可以只修改和构建存在于glibc\elf\目录中的链接器源代码 如果可能的话,我如何让我的测试程序使用我自己构建的动态链接器的新版本来切换,而不是使用默认的未修改的链接器 非常感谢您的指点或建议。 (如果需要更多信息,请告诉我) 编辑:: @康斯坦提乌斯

我试图在64位Ubuntu机器上修改libc6(2.15-0ubuntu20.2)中提供的动态链接器

因此,目前我的代码使用的是同一版本的glibc库。(我已经下载了相同的源代码并正在进行处理)。我的问题是,在不构建整个glibc库的情况下,是否可以只修改和构建存在于
glibc\elf\
目录中的链接器源代码

如果可能的话,我如何让我的测试程序使用我自己构建的动态链接器的新版本来切换,而不是使用默认的未修改的链接器

非常感谢您的指点或建议。 (如果需要更多信息,请告诉我)

编辑:: @康斯坦提乌斯

我按照您链接的帖子中的步骤构建ld.so。 但是我在make上得到了以下错误,并且我检查了ld.so在elf中不存在。 错误是::

/var/services/homes/abhi/test/ld/eglibc-build/elf/librtld.os: In function `generic_getcwd':
/var/services/homes/abhi/test/ld/eglibc-2.15/elf/../sysdeps/posix/getcwd.c:356: undefined reference to `__closedir'
/var/services/homes/abhi/test/ld/eglibc-2.15/elf/../sysdeps/posix/getcwd.c:368: undefined reference to `__fdopendir'
/var/services/homes/abhi/test/ld/eglibc-2.15/elf/../sysdeps/posix/getcwd.c:384: undefined reference to `__readdir'
/var/services/homes/abhi/test/ld/eglibc-2.15/elf/../sysdeps/posix/getcwd.c:397: undefined reference to `rewinddir'
/var/services/homes/abhi/test/ld/eglibc-2.15/elf/../sysdeps/posix/getcwd.c:528: undefined reference to `__closedir'
/var/services/homes/abhi/test/ld/eglibc-2.15/elf/../sysdeps/posix/getcwd.c:490: undefined reference to `__closedir'
collect2: error: ld returned 1 exit status
make[2]: *** [/var/services/homes/abhi/test/ld/eglibc-build/elf/ld.so] Error 1
make[2]: Leaving directory `/var/services/homes/abhi/test/ld/eglibc-2.15/elf'
make[1]: *** [elf/subdir_lib] Error 2
make[1]: Leaving directory `/var/services/homes/abhi/test/ld/eglibc-2.15'
make: *** [all] Error 2
注意使用相同的基础架构,我可以构建和安装完整的GLIBC,因此我认为基础架构没有错误。 --我猜这个错误与编辑Makeconfig到所有subdirs=csu elf gmon io misc posix setjmp signal stdlib string time有关。 --对此有什么建议吗

已解决 除了我们之前编辑的内容之外,还需要在所有子目录列表中添加dirent


谢谢

虽然我不清楚glibc的构建系统是否能让这项工作变得简单,但没有根本原因说明在不构建libc.so的情况下无法构建和使用glibc动态链接器。我将仔细阅读顶级Makefile,以了解如何实现这一点

对于测试,有两种方法:

  • 显式调用动态链接器以运行程序,如中所示:

    ./ld-linux.so.2 a.out args ...
    
  • 链接程序时,通过将此选项传递给编译器驱动程序,指定备用动态链接器路径名(将存储在其
    PT_INTERP
    程序头中):

    -Wl,-dynamic-linker,/path/to/alternate/ld-linux.so.2
    
  • 引用。如果你没有得到什么,请评论-我会尽力解释

    建筑 要编译Glibc(
    ld.so
    无法独立编译),请下载并解压缩Glibc源代码tarball

    1确保下载的Glibc版本与系统当前版本相同

    2确保未设置环境变量LD_RUN_PATH

    3阅读安装手册,确保所有必要的工具链(make、Binutils等)都是最新的

    4确保正在编译的文件系统区分大小写,否则会看到奇怪的错误,如

    /scratch/elf/librtld.os: In function `process_envvars':
    /tmp/glibc-2.x.y/elf/rtld.c:2718: undefined reference to `__open'
    ...
    
    5
    ld。因此编译时应打开优化标志(-O2为默认值)。否则将导致奇怪的错误(参见常见问题解答中的问题1.23)

    6假设Glibc在

    /tmp/glibc-2.x.y/
    
    然后编辑
    /tmp/glibc-2.x.y/Makefile.in
    :取消对行的注释

    # PARALLELMFLAGS = -j 4
    
    并将4更改为适当的数字

    7因为我们只对
    ld.so
    感兴趣,而不是整个Glibc,所以我们只想构建
    ld.so
    所需的基本源文件。为此,编辑
    /tmp/glibc-2.x.y/Makeconfig
    :查找以开头的行

    all-subdirs = csu assert ctype locale intl catgets math setjmp signal \
      ...
    
    并将其更改为

    all-subdirs = csu elf gmon io misc posix setjmp signal stdlib string time
    
    8找到一个临时目录,比如
    /scratch
    。然后

    $ cd /scratch
    $ /tmp/glibc-2.x.y/configure --prefix=/scratch --disable-profile
    $ gmake
    
    由于我们没有构建整个Glibc,当
    gmake
    停止时(可能有一些错误),检查/scratch/elf/ld.so是否存在

    ld.so
    是一个静态二进制文件,这意味着它有自己的标准C例程实现(例如
    memcpy
    strcmp
    ,等等)。它有自己的类似printf的例程,称为
    \u dl\u debug\u printf

    测试
    您可以直接运行
    ld linux.so
    。它会抱怨这可能不是您想要的(但您确实想要这个),并提供您可以运行它的选项列表。另请参见
    man ld linux.so
    以了解调试标志,即可以定义
    ld_DEBUG
    环境变量以查看
    ld linux.so
    调试输出。

    如果遵循本文中的步骤并在执行make时出现此错误。我不能在评论中添加错误。。在主帖子中添加它。您还可以在使用
    patchelf--set-interpreter/foo/bar
    等工具编译程序后编辑程序的ELF解释器。