我正在尝试在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
注意使用相同的基础架构,我可以构建并安装完整的GLIBC,因此我不认为基础架构存在错误。 - 我猜这个错误是与编辑Makeconfig到all-subdirs = csu elf gmon io misc posix setjmp signal stdlib string time相关的错误。 - 关于这个的任何建议..
解决 除了我们之前编辑的内容之外,还需要在all-subdirs列表中添加dirent
由于
答案 0 :(得分:2)
虽然我不清楚glibc的构建系统是否能够轻松实现这一点,但没有基本原因可以在不构建libc.so的情况下构建和使用glibc动态链接器。我会仔细阅读顶级Makefile以了解如何使用它。
至于测试方法,有两种方法:
显式调用动态链接器来运行程序,如:
./ld-linux.so.2 a.out args ...
链接程序时,通过将此选项传递给编译器驱动程序,指定备用动态链接器路径名(将存储在其PT_INTERP
程序头中):
-Wl,-dynamic-linker,/path/to/alternate/ld-linux.so.2
答案 1 :(得分:2)
引用this page。如果你没有得到什么,请评论 - 我会试着解释。
编译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)。如果不这样做,最终会出现奇怪的错误(参见FAQ中的问题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的例程{ {1}}。
您可以直接运行_dl_debug_printf
。它会抱怨这可能不是你想要的(但你想要这个)并提供你可以运行它的选项列表。另请参阅ld-linux.so
以获取调试标志,即您可以定义man ld-linux.so
环境变量以查看LD_DEBUG
调试输出。