查找给定的gcc选项/标志的作用是什么?

3

我有一个项目,其中给了我几个Makefile文件并使用Pro*C进行预编译。它们需要从HP-Unix迁移到Linux系统。

目前没有问题,但在某些方面上,我无法理解(或者还没有找到正确的谷歌关键字),gcc调用中的某些选项/标志是做什么的。

以以下为例:

FLAGS_C=-Ae -v
FLAGS_PROC=-g +Z -Ae +M2

在man手册中,我没有找到关于-Ae+Z +M2的任何内容,但是在shell中调用它们只会显示它们的存在,而不知道它们将要做什么或等待什么。

从make的输出中,我只能看到+Z或+M2似乎正在等待一个不存在的目录。

$ gcc +Z 
gcc: +Z: No such file or directory 
gcc: no input files

接下来是输出内容:
<command-line>: error: missing '(' after predicate

由于我还没有看到一些更多的Makefiles,我想知道是否有任何好的资源可以帮助我弄清楚未知的选项/标志。

gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]

编辑: 正如其他人所提到的,+Z +M2很可能不是gcc选项。因此,我的对于gcc +Z调用的解释可能只是错误的理解。


我的GCC实际上拒绝了+ZFLAGS_PROC传递给了什么?您使用的是哪个版本的GCC? - John Zwinck
FLAGS_PROC被传递给Oracle过程编译器。 - Stefan
2个回答

4
GCC文档提供了一个概述页面,涵盖了几百个选项:https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html - -Ae 可能是具有谓词名称e-A预处理器选项
-A predicate=answer 使用谓词predicate和answer进行断言。此形式优于旧形式-A predicate(answer),因为它不使用shell特殊字符。 FLAGS_PROC似乎不是GCC选项。我从未听说过像+Z或+M2这样的选项,而且我的GCC会拒绝它们。
它们可能是HPUX链接器选项...?
您没有说您正在使用哪个版本的HPUX,这可能很重要。据我所知,+z / +Z选项仅与HPUX相关,与gcc或binutils无关。如果您的GCC按照通常的方式设置,使用GNU as,那么只使用标准HPUX工具集中的HPUX链接器。您可以检查'man ld',以查看这些选项是否与HPUX ld相关。很抱歉,我不再在我之前工作的地方工作了。 https://groups.google.com/d/msg/gnu.gcc.help/iWt83RMbt-8/rsAQ14_r-jgJ

他们可能是在使用HPUX系统,但现在代码正在从HPUX迁移到Linux系统; 不过,这可能是我的错误吗? $ gcc +Z gcc: +Z 没有那个文件或目录 gcc: 没有输入文件 - Stefan
1
我肯定排除这两个选项是GCC选项。 - dom0

1

我花了一些时间尝试使用gcc而不是HP C编译器(cc)在HP-UX 11.11上从hpux.connect.org.uk(HP-UX移植和存档中心)的源代码包中编译git-1-8.5.3(是的,在2021年)。

经过深入挖掘,以下两点变得明显:

  1. 传递给gcc或cc的命令行可能是编译器本身(gcc或cc),链接器(我的情况下为ld),汇编程序(我的情况下为as)或预处理器(我的情况下为cpp)的选项。
  2. +Z是链接器特定的选项。您可以在HP-UX链接器和库用户指南中获取有关此事项(以及其他事项)的文档(相关部分插入此处)@ https://support.hpe.com/hpesc/public/docDisplay?docId=c05074198&docLocale=en_US
创建位置无关代码(PIC)
在PA-32模式下,创建共享库的第一步是创建包含位置无关代码(PIC)的目标文件。有两种方法可以创建PIC目标文件:
- 使用下面描述的+z或+Z编译器选项编译源文件。 - 编写使用适当寻址模式的汇编语言程序,该方法在“编写和生成位置无关代码”(第188页)中进行了描述。
在PA-32模式下,+z和+Z选项会强制编译器生成PIC目标文件。在PA-64和IPF模式下,+Z选项是默认选项。
使用+z的示例
假设您有一些C函数存储在length.c中,用于将英制长度单位转换为公制长度单位。要使用C编译器编译这些例程并创建包含PIC目标文件,可以使用以下命令: ``` $ cc -Aa -c +z length.c ``` +z选项会创建PIC。然后,您可以将其与其他PIC目标文件链接以创建共享库,如“使用ld创建共享库”(第101页)中所述。
比较+z和+Z
在PA-32模式下,+z和+Z选项本质上是相同的。通常情况下,您应该使用+z进行编译。 但是,在某些情况下,当每个共享库引用的符号数超过预定限制时,您必须重新使用+Z选项进行编译。在这种情况下,链接器会显示错误消息,并告诉您使用+Z重新编译库。 在PA-64和IPF模式下,+Z是默认选项,编译器会忽略这些选项并生成PIC代码。
+z和+Z的编译器支持
在PA-32模式下,C、C++、FORTRAN和Pascal编译器都支持+z和+Z选项。 在PA-64和IPF模式下,C和C++编译器默认为+Z。
发现此信息的部分挑战在于,在我的系统上,“man cc”返回“没有cc的手册条目”。扫描/usr/share/man (find /usr/share/man -name“*cc *”)周围,发现手册页的名称为“bundled_cc”。在bundled_cc的底部有一行:
SEE ALSO

  System Tools

    as(1)             Translate assembly code to machine code.

阅读“man as”会提供以下内容:

      +z,+Z            Both of these options are used in the building
                       of shared libraries.  For a more complete
                       discussion regarding these options, see the
                       manual HP-UX Linker and Libraries User's Guide.
TL;DR: +Z和+Z是汇编选项,用于创建位置无关代码(PIC)。我认为在GCC中适当的替代选项是-fPIC,但我尚未成功实现,所以这可能不是全部答案。
更新:我已经成功完成了这个任务(或者至少表面上是成功的),使用-fPIC似乎是正确的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接