1

次のコードを含むオープンソースで遊んでいます

uint32_t addr = htonl(* (uint32_t *)RTA_DATA(rth));
if (htonl(13) == 13) {
    // running on big endian system
} else {
    // running on little endian system
    addr = __builtin_bswap32(addr);
}

システムがビッグエンディアンかリトルエンディアンかをチェックしているようif (htonl(13) == 13)です。それが正しいか?このようにチェックする理由を説明していただけますか?そしてなぜ彼は13を使うのですか?

また、addr = __builtin_bswap32(addr);コンパイルの問題「未定義の参照」が発生します。それを修正するための解決策はありますか?その関数は、新しいバージョンのgccライブラリにはもう存在しないようです。それが正しいか?

編集:

私が使用するツールチェーンは toolchain-i386_gcc-4.1.2_uClibc-0.9.30.1

コンパイルで使用したオプションの場合:

  • cからオブジェクトへのコンパイルオプションの場合:

    -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -I. -I/opt/lampp/htdocs/backfire/staging_dir/target-i386_uClibc-0.9.30.1/usr/include -O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts -D_GNU_SOURCE -MT

  • オブジェクトのバイナリ(リンカー)

    -O2 -pipe -march=i486 -funit-at-a-time -fhonour-copts -D_GNU_SOURCE -L/opt/lampp/htdocs/backfire/staging_dir/target-i386_uClibc-0.9.30.1/usr/lib -L/opt/lampp/htdocs/backfire/staging_dir/target-i386_uClibc-0.9.30.1/lib -L/opt/lampp/htdocs/backfire/staging_dir/toolchain-i386_gcc-4.1.2_uClibc-0.9.30.1/lib -Wl,-rpath-link=/opt/lampp/htdocs/backfire/staging_dir/target-i386_uClibc-0.9.30.1/usr/lib

4

1 に答える 1

2

htonl「ホストオーダー」番号をネットワークバイトオーダーに変換します。ホストの順序は、コードを実行しているシステムのエンディアンです。ネットワーク バイト オーダーはビッグ エンディアンです。ホスト対ネットワークが大対大である場合、それは変更がないことを意味します。これは、13->13が検証するものです。一方、ホストからネットワークへの接続が小さいから大きい場合は、スワッピングが発生することを意味するため、最下位バイト13(1 だけ変更すると全体の数が 1 だけ変わるため) が最も重要になります。 -significant-byte 13(そのバイトを 1 つずつ変更すると、全体の数が最大になるため)、および13-> (13 << 24).

13具体的には重要ではありません。リトルエンディアン表現がビッグエンディアン表現と同じでない限り、任意の数値を使用できます。(バイトスワップ0がまだ.00(65536 + 256)00 01 01 00

0x1234567832ビットの数値の場合、バイトが12 34 56 78(ビッグエンディアン)または78 56 34 12(リトルエンディアン)の順序ではない混合エンディアンシステムもあることに注意してください34 12 78 56。これらのシステムは一般的ではありませんが、まだ存在しており、ここに示すコードでは正しく処理できません。

http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/Other-Builtins.htmlおよびhttp://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Other-Builtins. htmlの提案__builtin_bswap32は gcc 4.3 で追加されたため、gcc 4.1.2 ツールチェーンには含まれていません。

于 2013-02-22T22:29:25.703 に答える