精华内容
下载资源
问答
  • fPIC

    千次阅读 2013-11-23 18:50:45
    -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...
     -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 and 32k on the m68k and RS/6000. The 386 has no such limit.)

    Position-independent code requires special support, and therefore works only on certain machines. For the 386, 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 the 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. 

    展开全文
  • gcc fpic

    2020-11-02 10:48:27
    -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库...

    -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

    gcc -shared -fPIC -o 1.so 1.c
    • 1

    这里有一个-fPIC参数
    PIC就是position independent code
    PIC使.so文件的代码段变为真正意义上的共享
    如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.
    也就是
    不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)
    如果被多个应用程序共同使用,那么它们必须每个程序维护一份.so的代码副本了.(因为.so被每个程序加载的位置都不同,显然这些重定位后的代码也不同,当然不能共享)
    我们总是用fPIC来生成so,也从来不用fPIC来生成.a;fPIC与动态链接可以说基本没有关系,libc.so一样可以不用fPIC编译,只是这样的so必须要在加载到用户程序的地址空间时重定向所有表目.

    因此,不用fPIC编译so并不总是不好.

    如果你满足以下4个需求/条件:
    1.该库可能需要经常更新
    2.该库需要非常高的效率(尤其是有很多全局量的使用时)
    3.该库并不很大.
    4.该库基本不需要被多个应用程序共享

    如果用没有加这个参数的编译后的共享库,也可以使用的话,可能是两个原因:
    1:gcc默认开启-fPIC选项
    2:loader使你的代码位置无关

    从GCC来看,shared应该是包含fPIC选项的,但似乎不是所以系统都支持,所以最好显式加上fPIC选项。参见如下:

    `-shared'
         Produce a shared object which can then be linked with other
         objects to form an executable.  Not all systems support this
         option.  For predictable results, you must also specify the same
         set of options that were used to generate code (`-fpic', `-fPIC',
         or model suboptions) when you specify this option.(1)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    -fPIC 的使用,会生成 PIC 代码,.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接。
    non-PIC 与 PIC 代码的区别主要在于 access global data, jump label 的不同。

    比如一条 access global data 的指令,
    non-PIC 的形势是:ld r3, var1
    PIC 的形式则是:ld r3, var1-offset@GOT,意思是从 GOT 表的 index 为var1-offset 的地方处指示的地址处装载一个值,即var1-offset@GOT处的4个 byte 其实就是 var1 的地址。这个地址只有在运行的时候才知道,是由 dynamic-loader(ld-linux.so) 填进去的。

    再比如 jump label 指令
    non-PIC 的形势是:jump printf ,意思是调用 printf。
    PIC 的形式则是:jump printf-offset@GOT,
    意思是跳到 GOT 表的 index 为 printf-offset 的地方处指示的地址去执行,这个地址处的代码摆放在 .plt section,每个外部函数对应一段这样的代码,其功能是呼叫dynamic-loader(ld-linux.so) 来查找函数的地址(本例中是 printf),然后将其地址写到 GOT 表的 index 为 printf-offset 的地方,同时执行这个函数。这样,第2次呼叫 printf 的时候,就会直接跳到 printf 的地址,而不必再查找了。

    GOT 是 data section, 是一个 table, 除专用的几个 entry,每个 entry 的内容可以再执行的时候修改;
    PLT 是 text section, 是一段一段的 code,执行中不需要修改。
    每个 target 实现 PIC 的机制不同,但大同小异。比如 MIPS 没有 .plt, 而是叫 .stub,功能和 .plt 一样。

    可见,动态链接执行很复杂,比静态链接执行时间长;但是,极大的节省了 size,PIC 和动态链接技术是计算机发展史上非常重要的一个里程碑。

    gcc manul上面有说
    -fpic 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 and 32k on the m68k and RS/6000. The 386 has no such limit.)

    -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 the m68k, PowerPC and SPARC. Position-independent code requires special support, and therefore works only on certain machines.

    关键在于GOT全局偏移量表里面的跳转项大小。
    intel处理器应该是统一4字节,没有问题。
    powerpc上由于汇编码或者机器码的特殊要求,所以跳转项分为短、长两种。

    -fpic为了节约内存,在GOT里面预留了“短”长度。
    而-fPIC则采用了更大的跳转项。

     

    原文链接http://blog.sina.com.cn/s/blog_54f82cc201011op1.html

    展开全文
  • -fpic 与-fPIC的区别

    万次阅读 2018-08-22 10:31:17
    -fpic 与-fPIC的区别 前言  在编译动态库的时候,我们应该需要使用-fpic 或-fPIC参数。如下所示:  然后,使用gcc或g++ 命令生成动态库 pic 与PIC的异同  相同点:都是为了在动态库中生成位置无关的代码...

                                                        -fpic 与-fPIC的区别

    前言

            在编译动态库的时候,我们应该需要使用-fpic 或-fPIC参数。如下所示:

             然后,使用gcc或g++ 命令生成动态库

    pic 与PIC的异同

            相同点:都是为了在动态库中生成位置无关的代码。通过全局偏移表(GOT)访问所有常量地址。程序启动时动态加载程序解析GOT条目。

            不同点:如果链接的可执行文件的GOT大小超过计算机特定的最大大小,则会从链接器收到错误消息,指示-fpic不起作用;在这种情况下,请使用-fPIC重新编译。GOT大小根据操作系统的不同而大小不一样,SPARC上为8k,在AArch64上为28k,在m68k和RS / 6000上为32k。x86没有此限制。

    总结

            为了兼容各个系统,在生成位置无关的代码的时候,应该使用-fPIC参数。

    参考资料

           [1].https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options

     

     

    展开全文
  • gcc -fpic 和 -fPIC 参数问题

    千次阅读 2019-11-14 16:54:08
    gcc -fpic 和 -fPIC 参数问题 目的:生成位置无关的代码。 位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的...

    gcc -fpic 和 -fPIC 参数问题

    目的:生成位置无关的代码。

    位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

    如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.
    也就是
    不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)
    如果被多个应用程序共同使用,那么它们必须每个程序维护一份.so的代码副本了.(因为.so被每个程序加载的位置都不同,显然这些重定位后的代码也不同,当然不能共享)
    我们总是用fPIC来生成so,也从来不用fPIC来生成.a;fPIC与动态链接可以说基本没有关系,libc.so一样可以不用fPIC编译,只是这样的so必须要在加载到用户程序的地址空间时重定向所有表目.

    下面情况可以不用fPIC编译动态库so:

    1.该库可能需要经常更新
    2.该库需要非常高的效率(尤其是有很多全局量的使用时)
    3.该库并不很大.
    4.该库基本不需要被多个应用程序共享

    如果用没有加这个参数的编译后的共享库,也可以使用的话,可能是两个原因:
    1:gcc默认开启-fPIC选项
    2:loader使你的代码位置无关

     

    gcc 官网解释: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.

    如果目标计算机支持,则生成适合在共享库中使用的位置无关代码(PIC)。 这样的代码通过全局偏移表(GOT)访问所有常量地址。 动态加载程序在程序启动时解析GOT条目(动态加载程序不是GCC的一部分;它是操作系统的一部分)。 如果链接的可执行文件的GOT大小超过了计算机特定的最大大小,则您会从链接程序中收到一条错误消息,指示-fpic无法正常工作; 在这种情况下,请改用-fPIC重新编译。 (这些最大值在SPARC上为8k,在AArch64上为28k,在m68k和RS / 6000上为32k。x86没有此限制。)

    与位置无关的代码需要特殊的支持,因此仅在某些机器上有效。 对于x86,GCC支持PIC for System V,但不支持Sun 386i。 为IBM RS / 6000生成的代码始终与位置无关。

    设置此标志后,宏__pic__和__PIC__被定义为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.

    如果目标机器支持,则发出与位置无关的代码,该代码适用于动态链接并避免对全局偏移表的大小进行任何限制。 此选项对AArch64,m68k,PowerPC和SPARC有所不同。

    与位置无关的代码需要特殊的支持,因此仅在某些机器上有效。

    设置此标志后,宏__pic__和__PIC__被定义为2。

     

    展开全文
  • fpic编译

    2019-02-28 13:59:14
    gcc -shared -fPIC -o 1.so 1.c 这里有一个-fPIC参数 PIC就是position independent code PIC使.so文件的代码段变为真正意义上的共享 如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位...
  • 编译 -fPIC.pdf

    2021-09-14 14:52:09
    编译 -fPIC.pdf
  • 浅谈-fPIC与-fpic

    千次阅读 2019-04-22 08:02:23
    -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意 位置,都可以正确的执行。这正是共享...
  • 关于-fPIC, -fpic, -fpie, -fPIE的一点理解

    千次阅读 2020-06-17 16:53:46
    最近看到编译选项中有-fPIC,不知道什么意思,记录一下。 makefile文件部分: C_FLAGS += $(PLATFRM_BUILD_PARAM) -O2 -fPIC -g C_FLAGS += -Wl,-gc-sections,-Map,$(PRODUCT_NAME).map LDFLAGS += -lpthread -lm -...
  • 关于linux下的fPIC和openssl fPIC

    千次阅读 2018-01-19 14:45:46
    关于linux下的fPIC和openssl fPICgedit Makefilecc="gcc -fPIC"CFLAGS += -Os -fomit-frame-pointer -g -Wall -fPIC ###加入 -fPIC 参数 -fPIEmake CFLAGS=-fPICmake CC="gcc -fPIC"linux编译openssl:./config -fPIC...
  • fPIC 浅解

    2020-08-29 13:14:16
    -fPIC与-fpic都是在编译时加入的选项,用于生成位置无关的代码**(Position-Independent-Code)。这两个选项都是可以使代码在加载到内存时使用相对地址,所有对固定地址的访问都通过全局偏移表(GOT)来实现。-fPIC和-...
  • gcc -fPIC

    2021-09-13 21:48:48
    gcc编译参数-fPIC的一些问题
  • -fpic -fPIC -fpie -fPIE

    千次阅读 2016-07-05 16:39:39
    -fpic -fPIC -fpie -fPIE
  • 1. 静态库没有fPIC编译, 只要在configure时加上--enable-shared即可, 即: ./configure --enable-shared2. 版本号问题, 参考gcc linker error: version node not found for symbol/usr/bin/ld: libgetfea.so: @...
  • gcc编译选项fpic/fPIC, fpie/fPIE的说明

    千次阅读 2019-08-20 15:11:07
    -shared; Create a shared library /* 创建...因为共享库的代码都是位置无关的,所以通常还需要添加编译选项-fPIC。 -fPIC; Generate position-independent code if possible (large mode) -fpic; Generate pos...
  • boost_linux_fPIC.rar

    2020-03-04 17:31:22
    boost的linux静态库版本,添加了-fPIC选项,一般的boost静态库没有此选项,动态库在调用的时候会报下面的内容,用了这个库就不会出了(网上教的编译方法都是针对1.55版本的,后面的版本代码都不一样): /usr/bin/...
  • 编译 -fPIC

    千次阅读 2017-06-06 18:48:36
    编译 -fPIC
  • -fPIC, -fpic, -fpie, -fPIE

    千次阅读 2018-07-27 21:06:49
    -fPIC与-fpic都是在编译时加入的选项,用于生成位置无关的代码(Position-Independent-Code)。这两个选项都是可以使代码在加载到内存时使用相对地址,所有对固定地址的访问都通过全局偏移表(GOT)来实现。-fPIC和-fpic...
  • -fPIC问题

    2020-04-07 16:53:51
    relocation R_X86_64_32S against `.bss' can not be used when making a PIE object; recompile with -fPIC问题 加入-static选项可解决:gcc hello.o -static -o hello
  • 关于-fPIC选项 和 GOT表.pdf
  • gcc and fPIC

    2015-12-02 13:37:46
    1. 编译动态库一般是需要-fPIC的,否则和exe link时会报错 2. 静态库一般是不需要的-fPIC,但是如果增加了-fPIC似乎会影响优化等级,而且导致gdb无法调试 3. 如果静态库要被动态库包含,则静态库也需要-fPIC
  • zlib带-fPIC编译

    2018-10-15 09:06:18
    我在编译opencv3.4时遇到-fPIC问题,一开始以为是opencv哪里没开-fPIC,尝试了几次发现是依赖的zlib库没用-fPIC编译。 relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; ...
  • gcc编译参数-fPIC的一些问题.pdf
  • -fpic作用

    千次阅读 2018-09-27 20:02:11
    其中-fPIC选项的作用是:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的, 所以动态载入时是通过代码拷贝的方式来满足不同的调用,而不能达到真正的代码段共享的目的...
  • cmake 增加-fPIC选项 gcc

    2021-08-19 10:05:54
    cmake生成makefile时候增加-fPIC选项很方面,命令如下: cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON<path-to-source>
  • gcc -fPIC选项

    2018-07-07 15:29:34
    使用 -fPIC 选项,会生成 PIC 代码。.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接。non-PIC 与 PIC 代码的区别主要在于 access global data, jump label 的不同。比如一条 access global data 的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,364
精华内容 15,345
关键字:

fpic