在LINUX中,确定.a库/归档是32位还是64位?


87

我们在Linux中分发了64位和32位版本的静态库。在对客户进行故障排除时,我希望我的诊断Shell脚本通过检查.a存档文件以确定它是32位还是64位来快速消除此问题。我想到的方法并不优雅:

  1. 提取一个.o成员并询问“文件”命令(例如,ELF 32位等)

  2. 开始包括一个编码为表示例如32bit.o / 64bit.o的虚拟成员,并使用“ ar -t”进行检查

我已经尝试过“ strings xyz.a | grep 32”,但这在所有版本中都无法正常工作。这不是令人心碎的问题,但是如果您知道一个优雅的解决方案,我想知道。


我知道stackoverflow.com/questions/184502/…,正在寻找更好的解决方案。
cvsdave 2011年

2
另一个问题中的解决方案似乎很巧妙地解决了这个问题,但是一种快速的方法是nm foo.a |。grep'^ 0'| 头-1 | wc -c-如果结果为17(16 + 1 == 8bytes + 1 char for line return),则为64bit;如果结果为9,则为32bit(8 + 1 == 4bytes + 1 char for line return)
Petesh

如果我14岁怎么办?o_0
Almo

Answers:


123

objdump 似乎是最好的方法:

objdump -f libfoo.a | grep ^architecture

1
file如下所述更容易阅读stackoverflow.com/a/8909086/233906
Cerber

1
我得到architecture: i386:x86-64, flags 0x00000039:..是否表示两者都..?那不太可能。请帮助:D
灰太狼'16

10
@Paladin:这是64位-objdump将x86架构描述为i386(普通的IA32),i386:x86-64(AMD64)和i386:x64-32(X32 32位地址空间长模式架构)。
caf

1
“ objdump”中的标志“ -f”指定显示库“ libfoo.a”的整个文件头的内容。然后,来自“ objdump”的输出将通过管道传递到grep命令,该命令搜索单词“ architecture”。字符“ ^”表示“体系结构”应从该行开始。
卢克·普奈尔

3
清理并删除objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u
重复对象

33

最简单的方法是使用file命令。

$file <.so file or .a file>

31
在msys环境中,这只是回显<file>:当前的ar归档文件,而不是目标体系结构。
烤饼

11
同样在我当前的Linux(Ubuntu)环境中。
Asherah 2014年

4
同样在centos7中
Chaim Geretz '16

它在Ubuntu 16.04上运行良好。(1)file armeabi/libpique.so-> libpique.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped。(2)file x86/libpique.so->libpique.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
rpattabi's

5
.so文件和.a文件不是同一件事。证明这适用于共享库与证明它适用于静态库不同。最初的问题是关于静态库(.a文件)的。在我的情况下(使用MSYS),caf发布的objdump解决方案可以在使用文件的情况下仅打印“ ar存档”,就像烤饼一样。
肖恩·伯顿


3

糟糕,缺少sed意味着它正在显示很多项目。

只是一个答案:

count=$(nm foo.a | grep '^0' | head -1 | sed 's/ .*//' | wc -c)
((count == 17)) && echo 64bit
((count == 9)) && echo 32bit
((count == 0)) && echo '??bit'

它应该如何工作:

  • nm-从库中获取符号
  • grep-获取以十六进制字符串开头的行(文件中符号的地址)
  • 头-获得第一行
  • sed-删除空格之后的所有内容,包括空格
  • wc-计算字符数。

在32位环境中,您将获得由8个十六进制数字组成的地址,添加新行将为您提供9;在64位环境中,您将获得由16个十六进制数字组成的地址,添加新行为您提供17


1
可能想在其中扔sed -e's
/。*

顺便说一句我得了73。关心解释为什么它应该起作用?
Francesco Dondi

糟糕,缺少sed非常重要。更新了答案,并解释了其工作原理
Petesh

1

如果有特定于特定版本的功能,则可以尝试使用nm然后使用grep作为该功能。


您也许可以编写一些代码来查找库中的特定字节。您可以尝试在两个文件上使用od并查找两者之间的差异。
ColWhi 2011年

1
另一个解决方案是重命名库。
ColWhi 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.