4

私は単純なC++プログラムを持っています:

#include <iostream>

int main()
{
        std::cout << "Hello\n";
        return 0;
}

ARMプラットフォーム用のアプリケーションをコンパイルするために使用するクロスコンパイルプラットフォームである「scratchbox」で遊んでいました。NokiaN900電話で実行します。

いくつかのパフォーマンスの問題を調査しているときに、最初に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
4

2 に答える 2

6

わかりませんが、test実際にはシステムtestコマンドであり、作成したプログラムではない可能性がありますか?これは、たとえば、現在のディレクトリ$PATHが含まれていない場合に発生する可能性があります。.そして、それが小さなプラットフォームであることを考えると、すべてtest、、mvなどは実際には1つの実行可能ファイルである可能性があり、それはそれが何と呼ばれるかを理解することによって正しいプログラムをエミュレートしますか?たとえば、 Busyboxを参照してください。

その場合、strcmp()基本的には、実行可能ファイルが何として実行されているかを把握しようとする実行可能ファイルです。解決策:プログラムに、以外の名前を付けるtestか、を実行しltrace <path_to_your_executable>/testます。

strrchr()呼び出しの前の呼び出しstrcmp()は、ディレクトリなしで実行可能ファイル「basename」を抽出しようとしていることを強く示唆しています。その場合、それを実行して"./test"もおそらく役に立たないので、一意の名前に変更する必要があります。(もう一度推測してください。)

理論的には、プラットフォームは実行可能ファイルを実行するときに何でもできるので、私は間違っている可能性があります。

于 2011-07-10T03:28:27.390 に答える
0

私はに精通していませんscratchboxが、に似ている場合はbusybox、その名前(argv[0])を、それが提供する一般的なUnixユーティリティ/機能と比較していると思います。一致するものがない場合は、コードに制御が渡されます。

于 2011-07-10T03:29:16.713 に答える