编程语言
首页 > 编程语言> > 一系列strcmp()在简单的C程序开始时调用

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

作者:互联网

我有简单的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

谢谢.

解决方法:

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

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

strcmp()调用之前的strrchr()调用强烈建议它在没有目录的情况下尝试提取可执行文件“basename”.在这种情况下,将其作为“./test”运行可能不会有所帮助,因此您应该将其重命名为独特的内容. (再猜一次.)

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

标签:c-2,linux,gcc,ltrace,re-engineering
来源: https://codeday.me/bug/20190530/1186704.html