如标题所示,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下载的二进制文件似乎可以正常显示库调用。
我想念什么?有人能够重现该问题吗?
最佳答案
这可能与使用-z now
编译的二进制文件有关。我创建了一个快速测试程序(我正在使用Ubuntu 16.04):
int main() {
write(0, "hello\n", 6);
return 0;
}
如果我使用
gcc -O2 test.c -o test
进行编译,则ltrace可以工作:$ ltrace ./test
__libc_start_main(0x400430, 1, 0x7ffc12326528, 0x400550 <unfinished ...>
write(0, "hello\n", 6hello
) = 6
+++ exited (status 0) +++
但是,当我使用
gcc -O2 test.c -Wl,-z,relro -Wl,-z,now -o test2
进行编译时,它不会:$ ltrace ./test2
hello
+++ exited (status 0) +++
您可以使用Ubuntu上
scanelf
包中的pax-utils
检查二进制文件是否像这样编译:$ 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
关于linux - 运行ltrace时无输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43213505/