次のコードを含むオープンソースで遊んでいます
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