Серия вызовов strcmp() в начале простой программы на C++
У меня есть простая программа C++:
#include <iostream>
int main()
{
std::cout << "Hello\n";
return 0;
}
я думаю, ты не можешь стать проще. Я играл с "scratchbox" - платформой кросс-компиляции, которую я использую для компиляции приложений для платформы ARM. Я запускаю его на своем телефоне Nokia 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
Благодарю.
2 ответа
Не уверен, но может быть так test
на самом деле это система test
команда, а не программа, которую вы написали? Это может произойти, например, если $PATH
не содержит .
, текущий каталог. И учитывая, что это небольшая платформа, все test
, mv
и т. д., на самом деле может быть только один исполняемый файл, который эмулирует правильную программу, выясняя, как она называется? Смотрите Busybox, например.
Если это так, все strcmp()
в основном исполняемый файл, пытающийся выяснить, как он запускается. Решение: назовите вашу программу как-нибудь иначе test
или беги ltrace <path_to_your_executable>/test
,
strrchr()
позвонить до strcmp()
звонки настоятельно предполагают, что он пытается извлечь исполняемый файл "basename", без каталога. В этом случае, работает как "./test"
вероятно, не поможет, поэтому вы должны переименовать его в нечто уникальное. (Просто предположение, снова.)
Я могу ошибаться, поскольку теоретически платформа может делать все что угодно, когда запускает исполняемый файл.
Я не знаком с scratchbox
, но если это похоже на busybox
Я полагаю, это сравнивает его названное имя (argv[0]
) с общими утилитами / функциями Unix, которые он предоставляет. Если ничего не найдено, он передает управление вашему коду.