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

cvs*_*ave 80 linux archive 32bit-64bit

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

  1. 提取.o成员并询问"file"命令(例如,ELF 32位等)

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

我试过"字符串xyz.a | grep 32",但这不适用于版本.这不是一个令人心碎的问题,但如果你知道一个优雅的解决方案,我想知道.

caf*_*caf 114

objdump 似乎是最好的方式:

objdump -f libfoo.a | grep ^architecture
Run Code Online (Sandbox Code Playgroud)

  • @Paladin:那是64位 - x86体系结构被objdump描述为`i386`(普通旧IA32),`i386:x86-64`(AMD64)和`i386:x64-32`(X32 32位地址) -space-in-long-mode架构). (8认同)
  • 清理并删除欺骗:`objdump -f lib.a | grep ^ architecture | 切-d'' - f-2 | 排序-u` :) (3认同)
  • `file` 更容易阅读,如下所述 http://stackoverflow.com/a/8909086/233906 (2认同)

小智 29

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

$file <.so file or .a file>
Run Code Online (Sandbox Code Playgroud)

  • 在msys环境中,这只是echos*<file>:current ar archive*,而不是目标架构. (29认同)
  • 同样在我当前的Linux(Ubuntu)环境中. (11认同)
  • .so文件和.a文件不是一回事.显示这适用于共享库与显示它适用于静态库不同.最初的问题是关于静态库(.a文件).在我的情况下(使用MSYS)caf发布的objdump解决方案使用文件只打印'ar archive'和scones一样. (4认同)
  • 同样在centos7 (3认同)

小智 16

只需使用file命令; 即file library.so


Pet*_*esh 5

哎呀,缺少 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'
Run Code Online (Sandbox Code Playgroud)

它应该如何工作:

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

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


Col*_*Whi 1

如果有特定于特定版本的函数,您可以尝试 nm 然后 grep 来查找该函数。