Ale*_*nov 4 c++ linux gcc re-engineering ltrace
我有简单的C++程序:
#include <iostream>
int main()
{
std::cout << "Hello\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想你不能变得更简单.我正在玩"scratchbox" - 我用来编译ARM平台应用程序的交叉编译平台.我在诺基亚N900手机上运行它.
在研究一些性能问题时,我注意到在开始时有几次调用strcmp().我使用"ltrace"来跟踪库调用,当我在目标(我的手机)上运行它时,看到一系列调用strcmp()现在让我很好奇 - 这些调用的目的是什么?
20:06 user@MaemoBox:~$ ltrace test
__libc_start_main(61732, 1, 0xbed66634, 345616, 345612 <unfinished ...>
__errno_location() = 0x4001d3b0
strrchr("test", '/') = NULL
getuid() = 29999
bsearch("test", 0x00055966, 146, 1, 0x0000ed38 <unfinished ...>
strcmp("test", "mv") = 7
strcmp("test", "sort") = 1
strcmp("test", "tr") = -13
strcmp("test", "sysctl") = 1
strcmp("test", "test") = 0
<... bsearch resumed> ) = 0x000559e2
Run Code Online (Sandbox Code Playgroud)
谢谢.
不确定,但test实际上可能是系统test命令,而不是你编写的程序?例如,如果$PATH不包含.当前目录,则可能发生这种情况.而且因为它是一个小平台上,所有的test,mv等等,实际上可能只是一个可执行文件,它模拟搞清楚什么是所谓的正确的程序?例如,请参阅Busybox.
如果是这种情况,所有strcmp()基本上都是可执行文件,试图弄清楚它的运行方式.解决方案:将程序命名为其他内容test,或运行ltrace <path_to_your_executable>/test.
将strrchr()在之前调用strcmp()呼叫有力地表明,它试图解压缩可执行"基本名",没有目录.在这种情况下,运行它"./test"可能没有帮助,所以你应该将它重命名为独特的东西.(再猜一次.)
我可能错了,因为从理论上讲,平台在运行可执行文件时可以做任何事情.