一系列strcmp()在简单的C++程序开始时调用

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)

谢谢.

Alo*_*hal 6

不确定,但test实际上可能是系统test命令,而不是你编写的程序?例如,如果$PATH不包含.当前目录,则可能发生这种情况.而且因为它是一个小平台上,所有的test,mv等等,实际上可能只是一个可执行文件,它模拟搞清楚什么是所谓的正确的程序?例如,请参阅Busybox.

如果是这种情况,所有strcmp()基本上都是可执行文件,试图弄清楚它的运行方式.解决方案:将程序命名为其他内容test,或运行ltrace <path_to_your_executable>/test.

strrchr()在之前调用strcmp()呼叫有力地表明,它试图解压缩可执行"基本名",没有目录.在这种情况下,运行它"./test"可能没有帮助,所以你应该将它重命名为独特的东西.(再猜一次.)

我可能错了,因为从理论上讲,平台在运行可执行文件时可以做任何事情.