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

abh*_*bhi 5 c linux compiler-construction linker glibc

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

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

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

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

编辑:: @constantius

我按照您链接的帖子中的步骤构建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
Run Code Online (Sandbox Code Playgroud)

注意使用相同的基础设施,我可以构建和安装完整的GLIBC,所以我不认为基础设施有错误. - 我猜这个错误是与编辑Makeconfig到all-subdirs = csu elf gmon io misc posix setjmp signal stdlib string time相关的错误. - 对此有任何建议..

已解决 除了我们之前编辑的内容之外,还需要在all-subdirs列表中添加dirent

谢谢

Mic*_*kov 3

引用此页。如果您没有得到什么,请评论 \xe2\x80\x94 我会尽力解释。

\n\n

建筑

\n\n

要编译 Glibc(ld.so不能独立编译),请下载并解压 Glibc 源 tarball。

\n\n

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

\n\n

2确保环境变量LD_RUN_PATH 未设置。

\n\n

3阅读安装并确保所有必需的工具链(Make、Binutils 等)都是最新的。

\n\n

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

\n\n
/scratch/elf/librtld.os: In function `process_envvars\':\n/tmp/glibc-2.x.y/elf/rtld.c:2718: undefined reference to `__open\'\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

5 ld.so应在优化标志打开的情况下进行编译(-O2 是默认值)。如果不这样做,最终会出现奇怪的错误(请参阅常见问题解答中的问题 1.23)

\n\n

6假设 Glibc 解压在

\n\n
/tmp/glibc-2.x.y/\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
# PARALLELMFLAGS = -j 4\n
Run Code Online (Sandbox Code Playgroud)\n\n

并将4更改为适当的数字。

\n\n

7由于我们只对 Glibc 感兴趣ld.so而不是整个 Glibc,因此我们只想构建ld.so. 为此,请编辑/tmp/glibc-2.x.y/Makeconfig:查找以以下内容开头的行

\n\n
all-subdirs = csu assert ctype locale intl catgets math setjmp signal \\\n  ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

并将其更改为

\n\n
all-subdirs = csu elf gmon io misc posix setjmp signal stdlib string time\n
Run Code Online (Sandbox Code Playgroud)\n\n

8找到一个临时目录,例如/scratch. 然后

\n\n
$ cd /scratch\n$ /tmp/glibc-2.x.y/configure --prefix=/scratch --disable-profile\n$ gmake\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于我们没有构建整个 Glibc,因此当gmake停止时(可能有一些错误),请检查 /scratch/elf/ld.so 是否存在。

\n\n

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

\n\n

测试

\n\n

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

\n