Серия вызовов 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, которые он предоставляет. Если ничего не найдено, он передает управление вашему коду.

Другие вопросы по тегам