【问题标题】:In LINUX determine if a .a library/archive 32-bit or 64-bit?在 LINUX 中确定 .a 库/存档是 32 位还是 64 位?
【发布时间】:2011-08-05 15:11:11
【问题描述】:

我们在 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/…,正在寻找更好的解决方案。
  • 另一个问题中的解决方案似乎很巧妙地解决了这个问题,但一个快速的方法是 nm foo.a | grep '^0' |头-1 | wc -c - 如果结果为 17(16+1 == 8bytes + 1 char 用于换行),则为 64bit,如果为 9,则为 32bit(8+1 == 4bytes + 1 char 用于换行)
  • 如果我得到 14 怎么办? o_0

标签: linux 32bit-64bit archive


【解决方案1】:

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

【讨论】:

  • 您也许可以编写一些代码来查找库中的特定字节。您可以尝试在两个文件上使用 od 并找出两者之间的差异。
  • 另一种解决方案是重命名库。
【解决方案2】:

哎呀,缺少 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 - 获取以十六进制字符串开头的行(文件中符号的地址)
  • head - 获取第一行
  • sed - 删除空格之后的所有内容,包括空格
  • wc - 计算字符数。

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

【讨论】:

  • 可能想在里面扔一个 sed -e 's/ .*//'
  • 顺便说一句,我得到了 73。愿意解释为什么它应该起作用吗?
  • 哎呀,缺少 sed 很重要。更新了答案,并解释了它应该如何工作
【解决方案3】:

objdump 似乎是最好的方法:

objdump -f libfoo.a | grep ^architecture

【讨论】:

  • file 更易于阅读,如下所述stackoverflow.com/a/8909086/233906
  • 我得到architecture: i386:x86-64, flags 0x00000039:.. 这是否意味着两者都是..?那不太可能。请帮忙:D
  • @Paladin:那是 64 位 - x86 架构被 objdump 描述为 i386(普通的旧 IA32)、i386:x86-64(AMD64)和 i386:x64-32(X32 32 位地址-space-in-long-mode 架构)。
  • 'objdump' 中的标志'-f' 指定显示库'libfoo.a' 的整个文件头的内容。 'objdump' 的这个输出然后通过管道传送到搜索单词'architecture' 的 grep 命令中。字符“^”表示“架构”应该开始该行。
  • 清理并删除欺骗:objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u :)
【解决方案4】:

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

$ file <.so file or .a file>

【讨论】:

  • 在 msys 环境中,这只是回显 : current ar archive,而不是目标架构。
  • 在我当前的 Linux (Ubuntu) 环境中也是如此。
  • centos7 中也一样
  • 它在 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
  • 一个 .so 文件和一个 .a 文件不是一回事。显示这适用于共享库与显示它适用于静态库不同。最初的问题是关于静态库(.a 文件)。在我的情况下(使用 MSYS),caf 发布的 objdump 解决方案在使用文件的情况下只打印与烤饼一样的“ar 存档”。
【解决方案5】:

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

【讨论】:

  • 这个问题是专门针对静态库的。
猜你喜欢
  • 2010-09-19
  • 2010-12-14
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多