我花了一些时间尝试使用gcc而不是HP C编译器(cc)在HP-UX 11.11上从hpux.connect.org.uk(HP-UX移植和存档中心)的源代码包中编译git-1-8.5.3(是的,在2021年)。
经过深入挖掘,以下两点变得明显:
- 传递给gcc或cc的命令行可能是编译器本身(gcc或cc),链接器(我的情况下为ld),汇编程序(我的情况下为as)或预处理器(我的情况下为cpp)的选项。
- +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似乎是正确的答案。
+Z
。FLAGS_PROC
传递给了什么?您使用的是哪个版本的GCC? - John Zwinck