【问题标题】:Determining whether a library archive for AIX is 32-bit, 64-bit, or both, from Linux从 Linux 确定 AIX 的库归档文件是 32 位、64 位还是两者兼有
【发布时间】:2010-12-14 21:27:35
【问题描述】:

在 AIX 上,我会运行:

ar -X32 -t libdb2.a

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

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

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

【问题讨论】:

    标签: aix


    【解决方案1】:

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

    $ 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 以获取更多说明。

    【讨论】:

      【解决方案2】:

      我认为没有简单的方法。如果创建两个 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 的工具)。

      【讨论】:

      • 我没有得到那个名字,但这无关紧要。新建的 ar 不喜欢 -X32、-X64 或 -X32_64,几乎忽略了它们。但是,我也许可以只看一下出来的文件名并假设它们遵循我们的标准,所以,除非其他人有更好的想法,否则这可能是我们采用的长期解决方案,如果我们能得到“重新编译 binutils 并将其放在公开的地方”过去我们的律师。
      【解决方案3】:

      我建议从 .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 与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
      

      【讨论】:

      • 好的,如何在 Linux 上从存档中提取 .o 文件? ar 似乎不愿意这样做。
      • 我不确定您的 ar 为何无法打印模块。我会首先列出模块以确保它存在。 ar 和泥土一样古老,而且比 tar 还要早,而 tar 也已经存在了一段时间。
      猜你喜欢
      • 2011-08-05
      • 2010-09-19
      • 2010-12-28
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2011-04-19
      相关资源
      最近更新 更多