加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 运行ltrace时没有输出

发布时间:2020-12-14 01:20:45 所属栏目:Linux 来源:网络整理
导读:正如标题所说,ltrace在我的系统上无法正常工作. 在大多数情况下,它没有输出,例如 $ltrace ls[usual ls output]+++ exited (status 0) +++$gcc hello.c$ltrace ./a.outHello world!+++ exited (status 0) +++ 我正在使用最新的ltrace版本(来自包0.7.3-5.1ubun
正如标题所说,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下载的二进制文件似乎工作正常,正确显示库调用.

我错过了什么?有人能够重现这个问题吗?

解决方法

这可能与使用“relro now”编译的二进制文件有关.我创建了一个快速测试程序(我正在使用Ubuntu 16.04):

int main() {
  write(0,"hellon",6);
  return 0;
}

如果我用gcc -O2 test.c -o test编译它,那么ltrace工作:

$ltrace ./test 
__libc_start_main(0x400430,1,0x7ffc12326528,0x400550 <unfinished ...>
write(0,6hello
)                                                              = 6
+++ exited (status 0) +++

但是当我用gcc -O2 test.c -Wl,-z,relro -Wl,-z编译时,现在-o test2然后它不会:

$ltrace ./test2 
hello
+++ exited (status 0) +++

您可以使用Ubuntu上的pax-utils包中的scanelf来检查二进制文件是否已编译:

$scanelf -a test*
 TYPE    PAX   PERM ENDIAN STK/REL/PTL TEXTREL RPATH BIND FILE 
ET_EXEC PeMRxS 0775 LE RW- R-- RW-    -      -   LAZY test 
ET_EXEC PeMRxS 0775 LE RW- R-- RW-    -      -   NOW test2

注意LAZY(ltrace工作)与NOW(ltrace没有).

这里有一些讨论(但没有解决方案):

https://bugzilla.redhat.com/show_bug.cgi?id=1333481

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读