【发布时间】:2017-08-30 00:34:43
【问题描述】:
正如标题所说,ltrace 在我的系统上无法正常工作。 在大多数情况下它不会显示任何输出,例如
$ltrace ls
[usual ls output]
+++ exited (status 0) +++
$gcc hello.c
$ltrace ./a.out
Hello world!
+++ exited (status 0) +++
我正在使用最新的 ltrace 版本(来自包 0.7.3-5.1ubuntu4),我什至尝试从源代码重新编译,没有任何区别。
我正在使用 Ubuntu 16.10,内核 4.8.0-42-generic。 gcc 版本是6.2.0。
奇怪的是,从 Internet 下载的二进制文件似乎可以正常工作,正确显示库调用。
我错过了什么?有没有人能重现这个问题?
【问题讨论】:
-
我可以在 16.10 上重现,其中 gcc 已配置为默认生成 PIE 可执行文件。根据其变更日志,ltrace 从 0.7.0 开始就支持 PIE 可执行文件,所以我不确定为什么 0.7.3 版本不起作用。解决方法是使用
--no-pie编译您的程序,尽管这会稍微降低安全性(仍将为共享库启用 ASLR,但不会为可执行文件启用)。 -
@MarkPlotnick 我试图用
--no-pie编译,不幸的是......--no-luck:) 仍然是同样的问题。即使它有效,我仍然不明白为什么 /bin/ls & Co. 没有被追踪。由于您能够重现,我已将其发布到 ltrace-devel 邮件列表,让我们看看是否有人可以解决这个奇怪的问题。 -
@MarkPlotnick 我弄错了。
--no-pie单独给了我错误relocation R_X86_64_32 against .rodata can not be used when making a shared object; recompile with -fPIC,所以我想我会按照建议用-fPIC重新编译......太糟糕了,仍然会产生一个 PIE。所以,我想你的解释是对的,我检查了命令hardening-check,所有无法追踪的二进制文件都是 PIE;似乎这不仅仅与 gcc 6 有关,因为我尝试使用 gcc 5 进行编译并且没有选项(生成 PIE)。另外我不确定我的系统二进制文件是如何编译的。
标签: linux ubuntu shared-libraries ltrace