Серия вызовов strcmp () в начале простой программы на C ++ - PullRequest
4 голосов
/ 10 июля 2011

У меня есть простая программа на 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 ]

6 голосов
/ 10 июля 2011

Не уверен, но может ли быть так, что test на самом деле является системой test командой , а не программой, которую вы написали? Это может произойти, например, если $PATH не содержит ., текущий каталог. И, учитывая, что это небольшая платформа, все test, mv и т. Д. Фактически могут быть только одним исполняемым файлом, который эмулирует правильную программу, выясняя, как она называется? См., Например, Busybox .

Если это так, все strcmp() в основном исполняемые файлы, пытающиеся выяснить, как он запускается. Решение: назовите вашу программу как-нибудь иначе, чем test, или запустите ltrace <path_to_your_executable>/test.

Вызов strrchr() перед вызовами strcmp() убедительно свидетельствует о том, что он пытается извлечь исполняемое «базовое имя» без каталога. В этом случае запуск его как "./test", вероятно, не поможет, поэтому вы должны переименовать его в нечто уникальное. (Просто предположение, снова.)

Я могу ошибаться, поскольку теоретически платформа может делать все что угодно, когда запускает исполняемый файл.

0 голосов
/ 10 июля 2011

Я не знаком с scratchbox, но если он похож на busybox, я предполагаю, что он сравнивает его названное имя (argv[0]) с общими утилитами / функциональными возможностями Unix, которые он предоставляет.Если ничего не найдено, он передает управление вашему коду.

...