C 有没有一种方法可以检查库是为little-endian还是big-endian架构构建的,而不执行它';s代码?

C 有没有一种方法可以检查库是为little-endian还是big-endian架构构建的,而不执行它';s代码?,c,endianness,C,Endianness,有没有一种方法可以在不执行代码的情况下检查库是为little endian还是big endian架构构建的 比如说,我有一个库X,但是,我不知道它是为little endian还是big endian构建的,是否有任何命令,或者是否有方法通过构建输出来确定库是为little endian还是big endian构建的?或者可以将此信息放入库中吗?如果您正在运行linux/unix,最简单的方法是使用file命令 $ file /lib64/libc-2.15.so /lib64/libc-2

有没有一种方法可以在不执行代码的情况下检查库是为little endian还是big endian架构构建的


比如说,我有一个库X,但是,我不知道它是为little endian还是big endian构建的,是否有任何命令,或者是否有方法通过构建输出来确定库是为little endian还是big endian构建的?或者可以将此信息放入库中吗?

如果您正在运行linux/unix,最简单的方法是使用file命令

$ file /lib64/libc-2.15.so 
/lib64/libc-2.15.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), BuildID[sha1]=0x2dc710cc03932ca6fb7f223e2c0f67e21adebb4f, for GNU/Linux 2.6.32, not stripped
因此,信息肯定会内置到库标题中。您可以使用readelf命令进行检查

$ readelf -h /lib64/libc-2.15.so
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - GNU
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x3fc4c21840
  Start of program headers:          64 (bytes into file)
  Start of section headers:          2062800 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         10
  Size of section headers:           64 (bytes)
  Number of section headers:         43
  Section header string table index: 42

在windows中,我不知道如何检查,但应该在dll的头中。

现有的机器很少可以在同一硬件上运行小端或大端代码,所以这个问题几乎无关紧要。IIRC,有一些机器(MIPS RISC机器?)可以运行big-endian或little-endian,如果需要,可以在运行时切换


但是,如果您的库是为x86/64(一种小的endian体系结构)编译的,那么它在SPARC或PPC(big-endian体系结构)上不起作用,但问题不是endian性,而是不同芯片的机器代码完全不同且不兼容的事实。

库采用什么格式?将ARM、PowerPC、Alpha、SPARC V9、MIPS、PA-RISC、SuperH SH-4和IA-64列为双端(能够运行小端和大端代码)@osgx:这很有趣;我不知道名单上有这么多。不过,顺便说一下,SPARC和PowerPC的正常操作模式是big-endian,或者,至少,这是我看到它们分别在Solaris和AIX上运行的模式。我认为是“
LSB
”表示它是小endian,但我认为这不是不言而喻的(对我来说,“LSB”表示最低有效字节)。我想你应该提到,在输出中,什么表示它的小端(以及在大端的情况下,输出会是什么)。