【问题标题】:Seg fault on running a program through linker?通过链接器运行程序时出现 Seg 错误?
【发布时间】:2014-02-23 06:39:13
【问题描述】:

我下载了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

【问题讨论】:

  • 您应该已经安装了新的 libc。但是,我相信您手动升级它是错误的。将您的发行版升级到更新版本的 Ubuntu。
  • @BasileStarynkevitch 我必须修改链接器并测试它是否按照更改工作(现在没有代码更改)。有没有办法为此目的测试新建的链接器?
  • 我建议在chroot-ed 环境中工作,您可以在其中安装迷你发行版并进行实验

标签: c linux linker segmentation-fault libc


【解决方案1】:

使用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 的一部分)。

【讨论】:

  • 所以我必须在运行新构建的ld.so时基本上将构建目录中的所有文件夹添加为命令行args中的库路径
  • 一个快速查询 - 如果我的一个程序使用 libsssl 或任何其他未作为 libc 的一部分构建的库,那么在这种情况下,我是否需要使用新构建的 libc 和链接器再次构建它们或上一个就够了?
  • 我之所以这样问,是因为我最终必须使用 Apache (httpd) 测试修改后的链接器,该链接器使用许多库,如 libssl、libcrypto 等,这些库不是作为 Libc 的一部分构建的。谢谢
  • @abhi 否:该规则仅适用于 glibc 本身的某些部分(它们都必须来自同一个版本)。其他库不需要重建。
猜你喜欢
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多