3

在 AIX 上,我会运行:

ar -X32 -t libdb2.a

并检查输出以确定存档中是否存在 32 位对象。与 -X64 类似,用于检查 64 位对象。但是,如果我在另一个平台上,并且需要检查存档以查看其中的内容,该怎么办?通常,当我需要检查时,我使用的是 Linux,但我也可以轻松地使用 Solaris 或 HP-UX。

我曾经检查过 shr.o 和 shr_64.o,因为这就是正在编译的内容,但它们开始出现在档案中的实际消息中,因此它们的可靠性已经下降到我现在的地步得到误报。

如果有人有指针,最好是我可以在 perl 中做的事情,那就太好了。

4

3 回答 3

1

我不认为有一个简单的方法。如果创建两个 AIX 归档,一个 32 位,一个 64 位,如下所示:

$ cat a.c
int foo (void) { return 42; }
$ xlc -q32 a.c -c -o a32.o
$ xlc -q64 a.c -c -o a64.o
$ ar -X32 cr a32.a a32.o
$ ar -X64 cr a64.a a64.o

你最终得到的档案不是 linux 可读格式的ar

$ file a32.a a64.a 
a32.a: archive (big format)
a64.a: archive (big format)
$ ar t a32.a
ar: a32.a: File format not recognized
$ ar t a64.a
ar: a64.a: File format not recognized

我尝试使用strings查看档案中是否有任何明显的东西,但什么也没找到。您剩下的唯一选择是构建一个针对 AIX 的 binutils 包(下载 binutils,使用 option 进行配置--target=powerpc-ibm-aix5.3,运行make并瞧:您powerpc-ibm-aix5.3-ar在构建树的某处有一个名为的工具)。

于 2009-11-11T17:17:53.420 回答
1

我建议从 .a 存档中提取其中一个 .o 文件,然后在其上运行 file 命令。例子:

$ file fortune/fortune.o
fortune/fortune.o: ELF 32-bit MSB relocatable, SPARC, version 1 (SYSV), not stripped

file不是每个系统的标准,但可以很容易地编译。或者,有几个 perl 模块file.

ar提供p打印相关文件的命令。例如:

$ ar p libcurl.a base64.o > /tmp/base64.o
$ file /tmp/base64.o  
base64.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
于 2009-11-10T04:38:41.430 回答
0

所以......我迟到了一年,但我遇到了完全相同的问题。这是我解决它的方法,希望对某人有所帮助:

$ ar t mylib.a
myobj1.o
myobj2.o
myobj3.o

$ mkdir /tmp/mylib
$ cp mylib.a /tmp/mylib
$ cd /tmp/mylib
$ ls
mylib.a

$ ar x mylib.a
$ ls
mylib.a
myobj1.o
myobj2.o
myobj3.o

$ file *

可能的结果:

mylib.a: current ar archive
myobj1.o: ELF 64-bit (...)
myobj2.o: ELF 64-bit (...)
myobj3.o: ELF 64-bit (...)

或者

mylib.a: current ar archive
myobj1.o: ELF 32-bit (...)
myobj2.o: ELF 32-bit (...)
myobj3.o: ELF 32-bit (...)

说明:存档库文件只是“.o”文件的集合,当您使用 ar 的“t”参数时,您列出存档的内容,而当您使用 ar 的“x”参数时,您提取它们。键入man ar以获取更多说明。

于 2010-11-25T00:32:38.327 回答