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

发布于 2024-11-01 17:13:27 字数 324 浏览 0 评论 0原文

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

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

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

我已经尝试过“strings xyz.a | grep 32”,但这在版本上效果不佳。这不是一个令人心碎的问题,但如果你知道一个优雅的解决方案,我想知道。

We distribute in Linux a static lib in both 64-bit and 32-bit versions. When troubleshooting a customer, I would like my diagnostic shell script to quickly eliminate the issue by checking the .a archive file to detetmine whether it is 32 or 64 bit. The methods that occur to me are less than elegant:

  1. extract a .o member and ask the "file" command (e.g., ELF 32-bit etc)

  2. start including a dummy member coded to indicate, e.g. 32bit.o/64bit.o and use "ar -t" to check

I have tried "strings xyz.a | grep 32" but this doesn't work well over versions. Not a heartbreaker problem, but if you know of an elegant solution, I would like to know.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

段念尘 2024-11-08 17:13:27

objdump 似乎是最好的方法:

objdump -f libfoo.a | grep ^architecture

objdump seems like the best way:

objdump -f libfoo.a | grep ^architecture
煞人兵器 2024-11-08 17:13:27

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

$ file <.so file or .a file>

The simplest way is to use the file command.

$ file <.so file or .a file>
回忆躺在深渊里 2024-11-08 17:13:27

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

Just use the file command; i.e. file library.so

荒人说梦 2024-11-08 17:13:27

哎呀,缺少 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

oops, that missing sed means that it was displaying to many items.

Just in an answer:

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

How it's supposed to work:

  • nm - get the symbols from the library
  • grep - get lines starting with a hex string (address of symbol in file)
  • head - get the first line
  • sed - remove everything past the whitespace, including the whitespace
  • wc - count the number of characters.

In a 32 bit environment, you get addresses made up of 8 hex digits, adding the new line gives you 9, In a 64bit environment, you get addresses made up of 16 hex digits, adding the new line gives you 17.

天气好吗我好吗 2024-11-08 17:13:27

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

If there are functions that are specific to a particular version you could try nm then grep for the function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文