我可以修改动态链接器并使用而无需重新编译glibc吗?

问题描述 投票:0回答:2

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

所以目前我的代码正在使用相同版本的 glibc 库。 (我已经下载了相同的源代码并正在处理它)。我的问题是,是否可以仅修改和构建 glibc\elf\ 目录中存在的链接器源代码,而不构建整个 glibc 库。


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

非常感谢任何指示或建议。 (如果需要更多信息请告诉我)

编辑::

@康斯坦蒂乌斯 我按照您链接的帖子中的步骤构建了 ld.so。 但我在 make 上遇到以下错误,我检查了 ld.so 不存在于精灵中。 错误是::

/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 到 all-subdirs = csu elf gmon io Misc posix setjmp signal stdlib string time 有关。 --对此有什么建议..

已解决

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

c linux linker glibc
2个回答
3
投票
此页

。如果您没有得到什么,请发表评论 - 我会尽力解释。 建筑

要编译 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.so 应在优化标志打开的情况下进行编译(-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 的例程,称为
_dl_debug_printf

测试

您可以直接运行

ld-linux.so

。它会抱怨这可能不是您想要的(但您正是想要这个),并为您提供可以运行它的选项列表。另请参阅

man ld-linux.so
了解调试标志,即您可以定义
LD_DEBUG
环境变量来查看
ld-linux.so
调试输出。
    


2
投票
构建系统

是否可以让这件事变得简单,但没有根本原因可以解释为什么你不能在不构建 libc.so 的情况下构建和使用 glibc 动态链接器。我会仔细阅读顶级 Makefile 以了解实现此功能的方法。 测试有两种方法:

    显式调用动态链接器来运行程序,如下所示:
  1. ./ld-linux.so.2 a.out args ...

  2. 链接程序时,通过将此选项传递给编译器驱动程序来指定备用动态链接器路径名(将存储在其
  3. PT_INTERP

    程序头中):

    
    
    -Wl,-dynamic-linker,/path/to/alternate/ld-linux.so.2

    
        
© www.soinside.com 2019 - 2024. All rights reserved.