当前位置:网站首页>gcc动态库fPIC和fpic编译选项差异介绍
gcc动态库fPIC和fpic编译选项差异介绍
2022-07-06 08:27:00 【鸿依】
作者以前并没有特别留意fPIC和fpic之间的差别,最近在aarch64服务器上编译遇到的一个问题,让自己好好的查询了一些资料,或许平常的开发人员并不容易遇到它,但愿对有缘的读者有一定帮助。
1)出动态库时,合并libnettle.a库遇到下面错误提示
/data/compilerdir/bin/opensdk/linux64/lib/libnettle.a(fat-arm64.o): in function `fat_init': /data2/compilerdir/nettle/fat-arm64.c:198:(.text.startup+0x184): relocation truncated to fit: R_AARCH64_LD64_GOTPAGE_LO15 against symbol `_nettle_aes192_decrypt_c' defined in .text section in /data/compilerdir/bin/opensdk/linux64/lib/libnettle.a(aes192-decrypt.o)
/usr/bin/ld: /data/compilerdir/nettle/fat-arm64.c:198: warning: too many GOT entries for -fpic, please recompile with -fPIC
collect2: error: ld returned 1 exit status
/data2/compilerdir/bin/libhyscoder.so] Error 1
其中关键提示为
warning: too many GOT entries for -fpic, please recompile with -fPIC
经查证 fpic 和 fPIC 比较
相同点:都是为了在动态库中生成位置无关的代码。通过全局偏移表(GOT)访问所有常量地址。程序启动时动态加载程序解析GOT条目。
不同点:如果链接的可执行文件的GOT大小超过计算机架构特定的最大值,则会在编译链接时报错误消息,提示 -fpic 不起作用;因此在这种情况下,需要使用 -fPIC 重新编译。GOT大小因芯片架构的不同而大小不一样,SPARC上为8k,在AArch64上为28k(笔者遇到的就是它,GOT超出了限制,所以报错),在m68k和RS / 6000上为32k。而x86上没有此限制。
提示
为了保障程序在跨平台编译时整体可用,通常情况下建议都用fPIC
参考来源地址
https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options
英文原文(如果上面地址不能访问,可以参考下面原文)
-fpic
Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code accesses all constant addresses through a global offset table (GOT). The dynamic loader resolves the GOT entries when the program starts (the dynamic loader is not part of GCC; it is part of the operating system). If the GOT size for the linked executable exceeds a machine-specific maximum size, you get an error message from the linker indicating that -fpic does not work; in that case, recompile with -fPIC instead. (These maximums are 8k on the SPARC, 28k on AArch64 and 32k on the m68k and RS/6000. The x86 has no such limit.)
Position-independent code requires special support, and therefore works only on certain machines. For the x86, GCC supports PIC for System V but not for the Sun 386i. Code generated for the IBM RS/6000 is always position-independent.
When this flag is set, the macros __pic__ and __PIC__ are defined to 1.
-fPIC
If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on AArch64, m68k, PowerPC and SPARC.
Position-independent code requires special support, and therefore works only on certain machines.
When this flag is set, the macros __pic__ and __PIC__ are defined to 2.
边栏推荐
- sys. argv
- [MySQL] log
- [research materials] 2021 Research Report on China's smart medical industry - Download attached
- Pyqt5 development tips - obtain Manhattan distance between coordinates
- tree树的精准查询
- ESP series pin description diagram summary
- leetcode刷题 (5.28) 哈希表
- Upgrade tidb operator
- VMware virtualization cluster
- C language custom type: struct
猜你喜欢
![[research materials] 2021 Research Report on China's smart medical industry - Download attached](/img/c8/a205ddc2835c87efa38808cf31f59e.jpg)
[research materials] 2021 Research Report on China's smart medical industry - Download attached
![[MySQL] lock](/img/ce/9f8089da60d9b3a3f92a5e4eebfc13.png)
[MySQL] lock

The resources of underground pipe holes are tight, and the air blowing micro cable is not fragrant?

指针和数组笔试题解析

Pointer advanced --- pointer array, array pointer

Configuring OSPF load sharing for Huawei devices

2022.02.13 - 238. Maximum number of "balloons"
![[research materials] 2021 live broadcast annual data report of e-commerce - Download attached](/img/a6/74da2f44c7b6b22fed2f8e41a55988.jpg)
[research materials] 2021 live broadcast annual data report of e-commerce - Download attached

What is the use of entering the critical point? How to realize STM32 single chip microcomputer?

【刷题】牛客网面试必刷TOP101
随机推荐
China polyether amine Market Forecast and investment strategy report (2022 Edition)
Rviz仿真时遇到机器人瞬间回到世界坐标原点的问题及可能原因
华为云OBS文件上传下载工具类
升级 TiDB Operator
Modify the video name from the name mapping relationship in the table
C语言 - 位段
Verrouillage [MySQL]
Research and investment forecast report of citronellol industry in China (2022 Edition)
1. Color inversion, logarithmic transformation, gamma transformation source code - miniopencv from zero
Roguelike游戏成破解重灾区,如何破局?
Nacos Development Manual
LDAP应用篇(4)Jenkins接入
[research materials] 2022 China yuancosmos white paper - Download attached
备份与恢复 CR 介绍
远程存储访问授权
China dihydrolaurenol market forecast and investment strategy report (2022 Edition)
3. File operation 3-with
Migrate data from a tidb cluster to another tidb cluster
[MySQL] lock
leetcode刷题 (5.29) 哈希表