有没有办法知道哪个编译器生成了静态库?

2024-01-07

第三方为我提供了一个静态库 (.a),用于在 Solaris 站上链接。 我尝试使用 sunpro 进行编译,但在链接步骤失败。

我想这个问题来自我使用的编译器(而不是 gcc?)或者只是它的版本(因为编译器提供的 std lib 可能会从库预期的版本发生变化,AFAIK 它可能会导致链接步骤中的错误)。

我怎么知道哪个编译器是用来生成这个库的?有一些工具可以做到这一点吗? sunpro/gcc 或其他什么选项?

作为提示:我前段时间读过,编译器在生成目标文件时使用不同的修饰约定(正确吗?)。仍然,“nm——去角”命令行很好地打印了这个静态库中调试符号的所有函数名称。它是如何工作的 ?如果我的假设没问题的话nm确实有办法解决静态库中使用的约定,不是吗?或者它只是意味着 lib 是由 GNU gcc 生成的,因为 nm 是 GNU binutils 的一部分?


从存档中提取目标文件,然后运行strings对其中一些命令(首先对较小的命令进行命令,因为筛选的噪音会更少)。许多编译器在目标文件中插入 ASCII 签名。

例如下面这个无意义的源文件,foo.c:

extern void blah();

当在我的 Fedora 10 机器上编译成 foo.o 时gcc -c -o foo.o foo.c结果是 647 字节foo.o对象文件。跑步strings on foo.o结果是


GCC: (GNU) 4.3.2 20081105 (Red Hat 4.3.2-7)
.symtab
.strtab
.shstrtab
.text
.data
.bss
.comment
.note.GNU-stack
foo.c  

这清楚地表明编译器是 GCC。即使我用它来编译它-fno-ident,.GNU-stack note ELF 部分仍然存在。

您可以使用以下命令提取目标文件ar实用程序,或使用 Midnight Commander(集成了 ar),或者您可以简单地运行strings存档(这可能会给您带来更多噪音并且相关性较低,但仍然会有所帮助。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法知道哪个编译器生成了静态库? 的相关文章

  • 在 Visual Studio 2012 中安装 OpenCV

    我正在尝试安装 OpenCV 来与 Visual Studio 一起使用 我使用的是2012Pro版本 但我认为它应该与vs10相同 我正在关注这个教程 http docs opencv org doc tutorials introduc
  • 在 ant/nant 中构建 Flex 项目

    我的公司经常遇到 Flex 项目构建中断的问题 出现该问题的主要原因是开发人员在本地计算机上执行的构建与在构建计算机上发生的构建根本不同 开发人员正在使用以下方式构建项目FlexBuilder eclipse并且构建机器正在使用命令行编译器
  • 无法识别的仿真模式:MinGW32 上的 elf_i386

    我正在尝试制作内核 但无法链接C与程序集一起输出 这ld 我收到错误 无法识别的仿真模式 elf i386 我正在使用 Windows 10 专业版以及 MinGW32 和 MSYS 我正在使用的代码 link ld link ld OUT
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • netdb.h 未正确链接

    我正在尝试编译这个程序 如引用的Beej 的网络编程指南第 19 页 include
  • 简单的openGL程序无法在ubuntu中链接

    我正在尝试进入 opengl 编程 但无法编译我的第一个非常非常简单的程序 链接过程每次都会失败 我发现这个答案 https stackoverflow com questions 859501 learning opengl in ubu
  • OCUnit 无法识别导入的文件

    我正在我的 iPhone 应用程序上使用 XCode 3 2 3 和 iOS 4 0 上的 OCUnit 进行单元测试 我已成功设置测试环境以适当地通过和失败基本测试 但是当我导入自己的文件 在本例中为 UserAccount h 时 它无
  • 适用于 Solaris 的 Java 8 中缺少 javaws

    看起来 Oracle 从 Java 8 for Solaris 中删除了 Java Web Start javaws 在 Java 8u51 中不再可用 来自兼容性指南 http www oracle com technetwork jav
  • boost.asio 链接和库

    我是 boost asio 编程的新手 并且在链接 boost 库时遇到困难 我的问题是 当我包含 asio 标头时 如何找出应该链接到我的项目的库 例如我用过 include
  • 如何查看共享库加载的顺序

    给定一个 ELF 二进制文件或共享对象 我如何才能最轻松地查看所需共享库的加载顺序 它们是否按照列出的顺序加载readelf d 我怎样才能最容易地看到所需共享库的加载顺序 Use LD DEBUG LD DEBUG files bin l
  • 在共享库中不使用 PLT 的情况下调用另一个目标文件中的函数?

    我有两个汇编代码 code1 s and code2 s我想从这两个构建一个可重定位 使用 fPIC 开关 共享库 I want code2 s调用一个函数 名为myfun1 其定义在code1 s 当我使用call myfun1 PLT
  • 具有重复符号的 C++ 插件库上的段错误

    我有一个跨平台 C 应用程序 它分为多个共享库 并从插件共享库加载附加功能 插件库应该是自包含的并自行运行 无需了解或依赖于调用应用程序 其中一个插件包含从主应用程序复制的代码 因此包含与引擎中的符号名称重复的符号名称 是的 我知道这通常是
  • 如何使用cmake查找库?

    要将可执行文件与驻留在标准位置的库链接 可以在 CmakeLists txt 文件中执行以下操作 create executable generate mesh generate mesh cpp target link libraries
  • 包含来自另一个目录的标头时出现 Visual Studio 链接错误

    简短的问题是 如何使用 Visual Studio 创建 编译 运行在不同目录中具有源代码的项目 以下是具体细节 我在一个目录中有一个类定义文件 hpp 和实现文件 cpp 在另一个目录中有一个 main cpp 文件 在 Visual S
  • C++中全局变量和静态成员变量动态初始化的实现

    我有一些关于执行C 中关于链接和可执行模块加载过程的变量初始化 我主要关心的是全局变量和静态成员变量的动态初始化 其中初始化过程涉及代码的执行 我正在寻找解决 Windows 和 Linux 问题的答案 我已经明白在静态初始化的情况下 编译
  • 框架链接错误,找不到图像?

    我在我的应用程序中使用 DarwiinRemote 的 WiiRemote framework 我已经通过下载源代码并要求垃圾收集以及针对 10 5 进行构建来修复了一些问题 但是 当我尝试将其添加到我的项目时 我收到控制台错误 dyld
  • Cmake:链接到静态内部库而不导出它

    我有一个具有以下结构的项目 path to my project CMakeLists txt internal libs internal lib1 libs lib1 lib2 lib1是一个静态库 lib2是一个静态库 interna
  • 构造函数定义和声明不匹配

    我有以下 C 代码 其中声明中构造函数的参数与构造函数的定义具有不同的常量性 testClass hpp class testClass public testClass const int x testClass cpp testClas
  • MySQL Connector/C++ 库链接错误问题

    PROBLEM 好吧 我一直在尝试遵循 MySQL Forge Wiki 和其他一些网站上的示例代码 这些网站提供了有关如何获得简单数据库连接的教程 但由于某种原因 我的项目总是因链接错误而失败 我可以我自己不明白为什么或如何解决它 我仍在
  • 将两个 VS2010 C++ 项目构建到同一输出文件夹中

    我在同一个 VS 2010 解决方案中有两个项目 他们重复使用相同的代码 我希望 VS2010 将两个项目的可执行文件构建到同一个输出文件夹中 显然这并不是微不足道的 尽管http msdn microsoft com en us libr

随机推荐