【问题标题】:GCC issue on AIXAIX 上的 GCC 问题
【发布时间】:2014-10-13 10:38:32
【问题描述】:

我正在 AIX 上使用 GCC 构建我的 C 程序。在构建它时,我指的是一些在 AIX 上使用 XLC 编译和构建的库。我的图书馆位置有两种形式,即同一个图书馆以 *.so 和 *.a 的形式存在。但是,在构建我的应用程序时,它静态链接到 *.a 库而不是 *.so 并且在动态加载库时,它引用 *.so 有没有办法控制它,以便我的库的静态和动态链接只发生在*。一种。

P.S 我无法从库位置删除 *.so 库。

我使用的命令如下:

$(PRODUCT)/lib 包含在 AIX 上使用 XLC 构建的库(*.a、*.so)

CC=/usr/bin/gcc -maix64

DynamicInboxLibGcc:

$(CC) -o InboxLib.o -I$(PRODUCT)/include -I. -L$(PRODUCT)/lib -fPIC -c InboxLib.c $(LIBS)   
$(CC) InboxLib.o -I$(PRODUCT)/include -ar -shared -o $(PRODUCT)/libInboxLibXlc.a -L$(PRODUCT)/lib $(LIBS)

WrapperLibGcc:

$(CC) -o DynamicLinkSample.o -I$(PRODUCT)/include -I. -L$(PRODUCT)/lib -qPIC -c DynamicLinkSample.c $(LIBS)
$(CC) DynamicLinkSample.o -I$(PRODUCT)/include -ar -shared -o $(PRODUCT)/CustomLib.a -L$(PRODUCT)/lib $(LIBS)

DynamicMainProgramGcc:

$(CC) -o DynamicMainProgram -wl -brtl MainProgram.c -Wall -fPIC -I$(PRODUCT)/include -I. -L/usr/lib/threadsi -L$(PRODUCT)/lib $(LIB_PATH)/CustomLib.a $(LIB_PATH)/libInboxLibXlc.a -ldl $(LIBS)

【问题讨论】:

  • 请给出您用于构建程序的确切命令,否则您的问题不清楚。
  • 您不能动态加载静态库 (*.a)。如果您仍有问题,请向我们展示您用于链接的命令行。
  • 不知道你对AIX有多熟悉。因此,您可能会发现此评论离题。但无论如何:AIX - 与其他 Unix 不同 - 不使用可执行格式 .ELF,而是使用它自己的称为 XCOFF 的格式。这种格式也支持静态库和动态库,但是静态与动态的含义略有不同。例如,所有 PowerPC 代码都是“自然”位置独立的,这使人们认为 AIX 上的静态库和动态库之间没有区别。 XCOFF 格式还支持单个文件中的 32 位和 64 位符号。
  • 您使用的是 CMAKE 还是 Automake 工具?您正在构建“共享”库,但您希望它具有后缀 .a? DynamicInboxLibGc:~-shared -o $(PRODUCT)/libInboxLibXlc.a~。我记得 GNU Linker(ld) 存在一些问题。在 AIX 上使用 gcc 时,最好使用 OS 提供的链接器。尝试拆分步骤并尝试分别调用步骤。
  • 不,我没有使用 CMAKE,我使用的是 make。我关心的不是我正在构建的共享库。我所指的库位于 $(PRODUCT)/lib 中。在这里,我有与 *.a 和 *.so 相同的库,这导致了问题

标签: gcc compiler-construction aix


【解决方案1】:
  • 尝试在 AIX 上执行 truss 并检查链接器是如何从 gcc 执行的(以及 IBM 或 GNU 的版本)
  • 尝试手动执行 ld 来链接二进制文件
  • 尝试将变量$(LIBS) 拆分为静态变量和动态变量。它们是从 gcc 传递到链接器的参数。
  • 如果您使用的是 gnu ld,那么您可能会使用类似 gcc <objectfiles> -Wl,-Bstatic -lstatic1 -lstatic2 -Wl,-Bdynamic -ldynamic1 -ldynamic2 的东西。选项-Wl 表示(将以下参数传递给链接器)。 -Bstatic-BDynamic 是 GNU 链接器的参数。如果您不使用它们,gcc 可能会推断出它自己的链接器参数。但也许它以某种方式失败了。特别是当 IBM 的链接器使用不同的参数时。

PS:我会在 GNU 之前推荐 AIX ld。

PS1:-fPIC 在 AIX 上被忽略

【讨论】:

  • 问题是我所指的库是第三方库,它们的名称将来可以更改,这就是为什么我不想通过指定它们的名称来直接链接它们。有什么方法可以强制链接器仅链接 *.a 库?
  • 很可能是的。但首先您必须知道您使用的是来自 GNU 的 binutils 的 ld 还是 IBM(AIX) 提供的 ld。当您执行 gcc 时,它只会编译源代码。它不会执行任何链接。取而代之的是,它将在后台静默执行ld。您必须知道执行了哪个ld,以及传递了哪些参数。然后您检查该特定链接器的文档。两个链接器的许多参数是相同的,但是说到细节你必须知道你使用的是哪个链接器。
【解决方案2】:

GNU Binutils 在 AIX 上无法正常运行。必须使用 AIX 汇编器和链接器。

默认情况下,AIX 链接更喜欢带有 .a 扩展名的文件,而不是 .so 文件扩展名。

AIX 的命名方案与 SVR4/Linux 不同。通常 AIX 共享对象是归档库的成员,例如,libfoo.a(shr.o) 表示共享对象(传统上称为 shr.o)是 libfoo.a 的归档成员。通常没有静态档案,或者至少没有单独的静态对象档案。是的,这与大多数软件包的默认构建和安装方式相冲突。

可以选择带有 -brtl 链接器选项的 .so 文件扩展名,但这会产生其他问题,因为它为运行时链接准备应用程序,这意味着在运行时覆盖符号。此功能在运行时非常昂贵。

最好不要有同名的库同时具有 .a 和 .so 文件扩展名版本。如果要动态链接,只需在库搜索路径目录中提供库的动态版本(.so 或 .a)。

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 2012-01-27
    • 2014-12-30
    • 2017-06-10
    • 1970-01-01
    • 2016-07-04
    • 2010-12-05
    • 2012-06-18
    • 2011-11-20
    相关资源
    最近更新 更多