精华内容
下载资源
问答
  • fPIc
    千次阅读
    2019-11-14 16:54:08

    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与-fpic

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

    -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),

    则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意

    位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

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

    这里有一个-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个需求/条件:

    该库可能需要经常更新

    该库需要非常高的效率(尤其是有很多全局量的使用时)

    该库并不很大.

    该库基本不需要被多个应用程序共享

    如果用没有加这个参数的编译后的共享库,也可以使用的话,可能是两个原因:

    gcc默认开启-fPIC选项

    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)

    -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则采用了更大的跳转项。

    创建共享库和链接可执行文件类似:首先把源代码编译成目标文件, 然后把目标文件链接起来。目标文件需要创建成位置无关码(position-independent code) (PIC),概念上就是在可执行程序装载它们的时候, 它们可以放在可执行程序的内存里的任何地方, (用于可执行文件的目标文件通常不是用这个方式编译的。) 链接动态库的命令包含特殊标志,与链接可执行文件的命令是有区别的。

    gcc中的-fpic选项,使用于在目标机支持时,编译共享库时使用。编译出的代码将通过全局偏移表(Global Offset Table)中的常数地址访存,动态装载器将在程序开始执行时解析GOT表项(注意,动态装载器操作系统的一部分,连接器是GCC的一部分).

    gcc中的-fPIC选项则是针对某些特殊机型做了特殊处理,比如适合动态链接并能避免超出GOT大小限制之类的错误。而Open64仅仅支持不会导致GOT表溢出的PIC编译。

    GOT 大小

    8k ----SPARC

    32k---- m68k and RS/6000.

    386 无限制.

    【总结】:

    -fPIC总是能够工作,但可能产生的代码较大。

    -fpic通常能产生更快更小的代码,但有平台限制。

    展开全文
  • warning: too many GOT entries for -fpic, please recompile with -fPIC相同点:都是为了在动态库中生成位置无关的代码。通过全局偏移表(GOT)访问所有常量地址。程序启动时动态加载程序解析GOT条目。不同点:如果...

    作者以前并没有特别留意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.
    
    展开全文
  • gcc编译参数-fPIC的一些问题(2012-07-26 15:41:08)ppc_85xx-gcc -shared -fPIC liberr.c -oliberr.so-fPIC作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址...

    gcc编译参数-fPIC的一些问题

    (2012-07-26 15:41:08)

    ppc_85xx-gcc -shared -fPIC liberr.c -o

    liberr.so

    -fPIC

    作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),

    则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意

    位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

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

    这里有一个-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)

    -fPIC 的使用,会生成 PIC

    代码,.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接。

    non-PIC 与 PIC

    代码的区别主要在于 access global data, jump label 的不同。

    比如一条 access global data

    的指令,

    non-PIC 的形势是:ld r3,

    var1

    PIC 的形式则是:ld r3,,意思是从 GOT 表的 index 为 var1-offset

    的地方处

    指示的地址处装载一个值,即处的4个 byte 其实就是 var1

    的地址。这个地址只有在运行的时候才知道,是由 dynamic-loader(ld-linux.so)

    填进去的。

    再比如 jump label

    指令

    non-PIC 的形势是:jump

    printf ,意思是调用 printf。

    PIC 的形式则是:jump,

    意思是跳到 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

    gcc编译参数-fPIC问题 `a local symbol' can not be used when making a shared object;

    gcc -shared -o hack.so hack.c/usr/bin/ld: /tmp/ccUZREwA.o: relocation R_X86_64_32 against `a local s ...

    c语言的编译过程和GCC 编译参数

    原文: http://www.cnblogs.com/zhangShanGui/p/4912135.html C语言的编译过程和GCC编译参数 C语言的编译一般有三个步骤: 预编译: gcc -E - ...

    Linux gcc编译参数

    最近编译一份开源代码,一编译就直接报错.我看了下报错信息,有点诧异.这些信息,放平常顶多就是个warnning而已啊,他这里怎么变成了error呢?我看了下Makefile,发现编译参数多了个-Wer ...

    GCC中-fpic解惑(转载)

    参考: 1.<3.18 Options for Code Generation Conventions>2.3.

    Linux共享对象之编译参数fPIC

    最近在看Linux编程的基础知识,打算对一些比较有趣的知识做一些汇总备忘,本文围绕fPIC展开,学习参考见文末. 在Linux系统中,动态链接文件称为动态共享对象(DSO,Dynamic Shared ...

    C语言的编译过程和GCC编译参数

    C语言的编译一般有三个步骤: 预编译: gcc -E -o a.e a.c 预编译a.c文件,生成的目标文件名为a.e 预编译就是将include包含的头文件内容替换到C文件中,同时删除代码中没用的注 ...

    gcc编译参数详解概述

    gcc 编译器是经常使用的,可是,自己却没有针对它做过专门的研究,当遇到问题了,总结一下,算是对未来有个积累吧. 一 关于编译告警: 1 -w : 关闭所有警告,不建议使用 2 -W 开启素有gcc ...

    gcc编译参数详解一(-ffunction-sections -fdata-sections)

    背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...

    C语言编译过程以及gcc编译参数

    1.1       C语言编译过程,gcc参数简介 1.1.1          C语言编译过程 一.gcc - o a a.c -o:指定文件输出名字 二.C语言编译的过程: 1.1.1       ...

    随机推荐

    Java——列表框:JList

    import java.awt.Container; import java.awt.GridLayout; import java.awt.event.WindowAdapter; import j ...

    python 中的json解析库

    当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...

    C&num; 中的命名规则

    需要注意: C# 区分大小写 ,若有int a 和 int A ,则a, 和 A是不同的 普通字段,属相,方法,类的命名规则: C#中推荐使用  camelCasing ,和 PascalCasing ...

    Maven&plus;Nexus&plus;Jenkins&plus;Svn&plus;Tomcat&plus;Sonar搭建持续集成环境(二)

    上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以 ...

    P90

    #include #define N 4 int fun(int a[][N]) { int i,j,max=a[0][0]; for(i=0;i<2;i++) f ...

    WEB浏览器与服务器通讯过程

    以访问网页www.baidu.com为例,下面是使用Wireshark捕捉到的数据: 浏览器先发起一个TCP连接,然后发送GET报文给服务器,服务器之后返回一个Response报文. 从服务器端返回时 ...

    小米平板4 Plus获取Root超级权限的步骤

    小米平板4 Plus有么好方法开启Root权限?大家都清楚,Android机器有Root权限,一旦手机开启root相关权限,就可以实现更强大的功能,打比方大家部门的营销部门的同事,使用个别营销应用都需 ...

    react children

    children react 中,属性名是一一对应的,除了children. 对于一个组件来说,其this.props.children拿到的是什么呢???举个

    遗忘Windows Server 2008R2密码的处理方法

    遗忘Windows Server 2008R2的处理方法 有的时候,我们会由于各种原因忘掉了服务器密码,比如服务器太多,太杂什么的,或直接是被人黑掉了,这个时候我们想要登录,发现我们已经没有办法了,其 ...

    展开全文
  • 嵌入式 Linux 上基于 ...这个问题涉及到生成位置无关代码的机制,在我这里的情况是,对于 -fPIC 选项的使用,需要放置在 -fpie 选项的后面位置,才能生效,就不会再出现上述编译错误。 CFLAGS += -O2 -pie -march=
  • 【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义-fpicGenerate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code ...
  • -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)....
  • gcc -fPIC

    2021-09-13 21:48:48
    gcc编译参数-fPIC的一些问题
  • 标签:在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结:fPIC的全称是 Position Independent Code, 用于生成位置无关代码。什么是位置无关代码,个人理解是代码...
  • -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)....
  • 使用libboostpython.so动态链接是没有问题的,但是使用libboostpython.a静态链接,会产生如下错误(图片是线程,道理是一样的): 原因在于boost的编译工具bjam在编译boost静态库时,没有使用-fPIC选项,使得编译出来...
  • cmake -fpic

    千次阅读 2021-11-23 10:36:06
    CMakeList.txt 添加 add_compile_options(-fPIC) 或者 set(CMAKE_C_FLAGS“$ {CMAKE_C_FLAGS} -fPIC”) set(CMAKE_CXX_FLAGS“$ {CMAKE_CXX_FLAGS} -fPIC”)
  • boost_linux_fPIC.rar

    2020-03-04 17:31:22
    boost的linux静态库版本,添加了-fPIC选项,一般的boost静态库没有此选项,动态库在调用的时候会报下面的内容,用了这个库就不会出了(网上教的编译方法都是针对1.55版本的,后面的版本代码都不一样): /usr/bin/...
  • 【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义-fpicGenerate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code ...
  • -fpic与-fPIC

    千次阅读 2020-09-22 18:20:10
    Object文件 我们在Linux开发过程中经常会遇到Object file这个名词,你可以称之为对象文件。常见的对象文件有三种: 可重定位的对象文件(Relocatable file) 这是由汇编器汇编生成的 .o 文件。...
  • 最近在编译ffmpeg的时候出现错误: gcc -L"/home/caizc/project/A-work/enflame/FFmpeg-n0.5.15"/libavdevice -L"/home/caizc/project/A-work/enflame/FFmpeg-n0.5.15"/libavformat -L"/home/caizc/project/A-work/...
  • -fPIC与-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 -...
  • cmake 增加-fPIC选项 gcc

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

    千次阅读 多人点赞 2021-06-05 09:51:12
    在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结: fPIC的全称是 Position Independent Code, 用于生成位置无关代码。什么是位置无关代码,个人理解是代码无...
  • 1. 静态库没有fPIC编译, 只要在configure时加上--enable-shared即可, 即: ./configure --enable-shared2. 版本号问题, 参考gcc linker error: version node not found for symbol/usr/bin/ld: libgetfea.so: @...
  • 关于添加-fPIC 参数一些理解与思考

    千次阅读 2021-03-15 19:29:05
    大概意思是缺少 -fPIC 这个编译参数 如果你是MakeFile方式的话,可以直接在gcc下增加,注意生成.o文件的时候要加,在后面打包成 .so的时候也要,如下所示: $gcc-fPIC -c hello.c $gcc-fPIC -c main.c $gcc -shared...
  • test-fpic.rar_The Test

    2022-09-21 18:05:15
    This test is used to check that -fpic is a default compiler option for the arm-linux-androideabi toolchain.
  • 问题背景:应用中引入了boost库,引用库使用-fPIC编译选项 为了能够直接使用静态库进行编译链接 编译错误:libboost_system.a(error_code.o): relocation R_X86_64_32 against `.rodata.str1.1’ can not be used ...
  • 编译库是添加-fPIC选项的方式及验证

    千次阅读 2021-12-08 10:45:49
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") 合适的位置可以理解为不影响其他组件编译的位置,或者用cmake宏可以控制的位置; 2.Makefile中, 查找DEBUG_...
  • Linux动态库-参数fPIC

    2021-11-24 18:07:04
    封装动态库: 步骤:生产.o中间文件,在此生产add.o...gcc -shared -fPIC -o libdemo.so add.o mult.o 构建动态库错误: /bin/ld: build/ana_service.o: relocation R_X86_64_32 against `.bss' can not be used ...
  • 之前一直使用libevent 动态库。发现每次都带很多歌so比较麻烦。决定使用静态库。 我使用一个动态库加载libevent。... recompile with -fPIC 我使用libevent-release-2.1.12-stable版本 通过修改libevent...
  • 1. 静态库没有fPIC编译, 只要在configure时加上--enable-shared即可, 即: ./configure --enable-shared2. 版本号问题, 参考gcc linker error: version node not found for symbol/usr/bin/ld: libgetfea.so: @...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,726
精华内容 18,290
关键字:

fPIc