一系列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