正如标题所说,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,"hello\n",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没有).
这里有一些讨论(但没有解决方案):