代码之家  ›  专栏  ›  技术社区  ›  Tanktalus

确定AIX的库存档是32位、64位还是两者都来自Linux

aix
  •  3
  • Tanktalus  · 技术社区  · 15 年前

    在AIX上,我将运行:

    ar -X32 -t libdb2.a
    

    并检查输出以确定存档中是否有32位对象。与-x64类似,用于检查64位对象。但是,如果我在另一个平台上,并且需要检查归档文件以查看它有什么功能呢?通常我在需要检查的时候使用Linux,但我也可以很容易地使用Solaris或HP-UX。

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

    如果有人有指针,最好是我能用Perl做的,那就太好了。

    3 回复  |  直到 14 年前
        1
  •  1
  •   F'x    15 年前

    我认为没有一个简单的方法。如果创建两个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,使用选项进行配置 --target=powerpc-ibm-aix5.3 运行 make 你有一个工具叫 powerpc-ibm-aix5.3-ar 在那棵树的某处)。

        2
  •  1
  •   brianegge    15 年前

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

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

    file 不是每个系统的标准,但可以很容易地编译。或者,有一个 couple of perl modules 做同样的事 文件 .

    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
    
        3
  •  0
  •   ruasoliveira    14 年前

    所以…我迟到了一年,但我也遇到了同样的问题。以下是我如何解决的,我希望它能帮助一些人:

    $ 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 进一步说明。