如标题所示,ltrace在我的系统上无法正常工作。在大多数情况下,它不显示任何输出,例如
$ltrace ls [usual ls output] +++ exited (status 0) +++ $gcc hello.c $ltrace ./a.out Hello world! +++ exited (status 0) +++
我使用的是最新的ltrace版本(来自package 0.7.3-5.1ubuntu4),我什至尝试从源代码重新编译也没有差异。我使用Ubuntu 16.10,内核4.8.0-42-generic。gcc版本是6.2.0。
0.7.3-5.1ubuntu4
16.10
4.8.0-42-generic
6.2.0
奇怪的是,从Internet下载的二进制文件似乎可以正常显示库调用。
我想念什么?有人能够重现该问题吗?
这可能与使用编译二进制文件有关-z now。我创建了一个快速测试程序(我正在使用Ubuntu 16.04):
-z now
int main() { write(0, "hello\n", 6); return 0; }
如果我用gcc -O2 test.c -o testltrace进行编译,则可以:
gcc -O2 test.c -o test
$ 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它编译时,它不会:
gcc -O2 test.c -Wl,-z,relro -Wl,-z,now -o test2
$ ltrace ./test2 hello +++ exited (status 0) +++
您可以使用Ubuntu上scanelf的pax-utils软件包检查二进制文件是否像这样编译:
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无效)。
LAZY
NOW
这里还有更多讨论(但没有解决方案):
https://bugzilla.redhat.com/show_bug.cgi?id=1333481