我可以在不重新编译glibc的情况下修改动态链接器并使用它吗?
我试图在64位Ubuntu机器上修改libc6(2.15-0ubuntu20.2)中提供的动态链接器 因此,目前我的代码使用的是同一版本的glibc库。(我已经下载了相同的源代码并正在进行处理)。我的问题是,在不构建整个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\目录中的链接器源代码 如果可能的话,我如何让我的测试程序使用我自己构建的动态链接器的新版本来切换,而不是使用默认的未修改的链接器 非常感谢您的指点或建议。 (如果需要更多信息,请告诉我) 编辑:: @康斯坦提乌斯
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
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'
...
5ld。因此编译时应打开优化标志(-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解释器。