4

我有一个简单的 C++ 程序:

#include <iostream>

int main()
{
        std::cout << "Hello\n";
        return 0;
}

我在玩“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
4

2 回答 2

6

不确定,但可能test实际上是系统test命令,而不是您编写的程序吗?例如,如果$PATH不包含.当前目录,则可能发生这种情况。鉴于它是一个小平台, all test,mv等实际上可能只是一个可执行文件,它通过弄清楚它被称为什么来模拟正确的程序?例如,参见Busybox 。

如果是这种情况,那么所有strcmp()基本上都是可执行文件,试图弄清楚它正在以什么方式运行。解决方案:将您的程序命名为 以外的名称test,或运行ltrace <path_to_your_executable>/test.

strrchr()调用之前的调用strcmp()强烈表明它正在尝试提取可执行文件“basename”,而没有目录。在这种情况下,运行它"./test"可能无济于事,因此您应该将其重命名为独特的名称。(再次猜测。)

我可能是错的,因为理论上,平台在运行可执行文件时可以做任何事情。

于 2011-07-10T03:28:27.390 回答
0

我不熟悉scratchbox,但如果它类似于busybox,我假设它正在将其调用名称 ( argv[0]) 与它提供的常见 Unix 实用程序/功能进行比较。如果没有匹配,它将控制权传递给您的代码。

于 2011-07-10T03:29:16.713 回答