我下载了libc6
的源代码,并成功完成了构建过程。(尽管我并没有故意做make install
)。
使用buil-dir/elf/ld.so
中构建的新链接器,我运行了一个程序,将其作为新建链接器的参数提供。
-
测试代码打印一些字符串,然后打印
malloc(sizeof(char)*1024)
。 -
在运行测试二进制文件作为新建链接器的参数时,我在
elf/dl-addr.c:132
处得到一个Seg Fault
,它是:131 /* Protect against concurrent loads and unloads. */
132 __rtld_lock_lock_recursive (GL(dl_load_lock));
-
这是seg故障之前的最后一帧,通过测试程序的
malloc()
调用进行调用。
此时的堆栈跟踪:
#0 0x0000000000000000 in ?? ()
#1 0x00007f11a6a94928 in __GI__dl_addr (address=0x7f11a69e67a0 <ptmalloc_init>, info=0x7fffe9393be0, mapp=0x7fffe9393c00, symbolp=0x0) at dl-addr.c:132
#2 0x00007f11a69e64d7 in ptmalloc_init () at arena.c:381
#3 0x00007f11a69e72b8 in ptmalloc_init () at arena.c:371
#4 malloc_hook_ini (sz=<optimized out>, caller=<optimized out>) at hooks.c:32
#5 0x00000000004005b3 in main () at test.c:20
使用机器上默认安装的链接器运行同一程序时,程序运行良好。
- 我不明白这背后的问题是什么?(这是不是因为我使用了新构建的链接器而没有先安装它而出错了)
如有任何建议或建议,我们将不胜感激。感谢
(系统详细信息GCC 4.8.22, eglibc-2.15 Ubuntu 12.10 64bit
使用
buil-dir/elf/ld.so
中构建的新链接器,我运行了一个程序,将其作为新建链接器的参数。
这就是你所做的一切,那么崩溃是预期的,因为你将新建的加载器与系统库混合在一起(这不起作用:glibc
的所有部分必须来自同一版本)。
你需要做的是:
buil-dir/elf/ld.so
--library-path buil-dir:buil-dir/dlfcn:buil-dir/nptl:...
/path/to/a.out
要搜索的目录列表必须包括程序使用的所有库(glibc的一部分)。