有没有办法检查是否为小端或大端架构构建了库而不执行它的代码?

时间:2013-01-30 05:04:08

标签: c endianness

有没有办法检查是否为小端或大端架构构建了一个库而没有执行它的代码?

让我们说,我有一个库X,但是,我不知道它是否是为小端或大端构建的,是否有任何命令或有没有办法通过构建输出找出该库是为小端还是大端建的?或者是否可以将此信息放在库中?

2 个答案:

答案 0 :(得分:8)

如果您正在运行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的标题中。

答案 1 :(得分:2)

现有的机器很少,您可以在同一硬件上运行小端或大端代码,因此问题几乎无关紧要。 IIRC,有一些机器(MIPS RISC机器?)可以运行大端或小端,并且可以在运行时切换。

但是,如果您的库是针对x86 / 64(一个小端架构)编译的,它将不适用于SPARC或PPC(大端架构),但问题不是字节序,而是机器的事实不同芯片的代码完全不同且不兼容。