与 __builtin_bswap32 相关的编译错误

标签 c build endianness htonl

我正在使用包含以下代码的开源

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); 还会导致编译问题“ undefined reference ”。有解决办法吗?看起来该函数在新版本的 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

最佳答案

htonl 将“主机顺序”数字转换为网络字节顺序。主机顺序是运行代码的系统上的字节顺序。网络字节顺序是大端字节序。如果主机到网络是大到大,则意味着没有变化——这就是 13 -> 13 将验证的内容。另一方面,如果主机到网络从小到大,这意味着您将进行交换,因此最低有效字节 13 (最少,因为将其更改 1 仅将总数更改为 1)最重要的字节 13 (最重要的是因为将该字节更改为一个字节会改变最大数量的总数),以及 13 -> (13 << 24)

13 具体来说并不重要。您可以使用任何数字,只要其小端表示与其大端表示不同即可。 ( 0 会很糟糕,因为 0 字节交换后仍然是 0(65536 + 256) 也一样,因为 32 位表示形式在大端和小端中都是 00 01 01 00

请注意,还有混合端系统,对于 32 位数字 0x12345678 ,您的字节顺序不是 12 34 56 78 (大端)或 78 56 34 12 (小端):我相信 34 12 78 56 是其中之一。这些系统并不常见,但它们仍然存在,并且此处的代码无法正确处理它们。

http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/Other-Builtins.htmlhttp://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Other-Builtins.html 建议在 gcc 4.3 中添加 __builtin_bswap32,因此您的 gcc 4.1.2 工具链不会有它。

关于与 __builtin_bswap32 相关的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14713807/

相关文章:

C - 如果结构在文件中如何保留数组

asp.net - 使用 Visual Studio 开发网站时,如何缩短构建时间?

postgresql - 使用反向字节序编译 PostgreSQL

c - 如何获得最大的 float ?

c - Wireshark 解析器 UINT64 位掩码

visual-studio-2010 - TFS 2010 - 根据环境排除部署时的特定文件?

java - Little Endian 到 Big Endian 精度误差

c - 类型转换类型是否取决于大/小端?

c - 在 C 中实现可变字符串的最有效方法是什么?

ios - 迪尔德 : Library not loaded//stat() failed with errno=1//code signature invalid for