首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

创建PIE对象时不能使用现有的静态库,请使用-fPIC重新编译c++

创建PIE对象时不能使用现有的静态库,需要使用-fPIC重新编译C++。

PIE(Position Independent Executable)是一种可在不固定内存地址的情况下执行的可执行文件格式。在编译时,如果希望生成PIE对象,就需要使用-fPIC选项重新编译C++代码。

-fPIC是GCC编译器的一个选项,它表示编译生成位置无关代码(Position Independent Code),可用于生成PIE对象。通过重新编译现有的C++代码,使用-fPIC选项,可以生成与当前操作系统和硬件平台兼容的PIE对象。

为了重新编译C++代码并生成PIE对象,可以按照以下步骤操作:

  1. 确保已经安装GCC编译器。如果没有安装,可以使用相应的包管理器进行安装。
  2. 打开终端或命令提示符,进入代码所在的目录。
  3. 执行以下命令来重新编译C++代码并生成PIE对象:
  4. 执行以下命令来重新编译C++代码并生成PIE对象:
  5. 这将使用-fPIC选项将your_code.cpp重新编译为位置无关代码,并将输出保存为your_code.o文件。
  6. 如果有多个源文件需要重新编译,可以将它们逐个添加到命令中。
  7. 如果有多个源文件需要重新编译,可以将它们逐个添加到命令中。
  8. 重新编译完成后,可以将生成的PIE对象与其他代码进行链接,以生成最终的可执行文件。
  9. 重新编译完成后,可以将生成的PIE对象与其他代码进行链接,以生成最终的可执行文件。
  10. 在链接过程中,确保将所有使用-fPIC选项重新编译的对象文件添加到命令中。

总结: PIE对象是一种可在不固定内存地址的情况下执行的可执行文件格式。为了创建PIE对象,需要使用-fPIC选项重新编译C++代码。重新编译可以按照上述步骤进行,先将源代码重新编译为位置无关代码,然后再将生成的对象文件与其他代码进行链接。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

g++入门教程

-l[library] 指定编译使用,例子用法 gcc -lcurses hello.c 使用curses编译连接,生成程序。...也可以用-W{warning}来标记指定的警告 -Wno-deprecated 使用C++标准废弃特性不告警 -Werror 要求GCC将所有的警告当成错误进行处理,在警告发生时中止编译过程。...这种情况下,请使用-fPIC重新编译 -fPIC 同-fpic功能一致,生成位置无关目标码,用于生成动态链接,建议使用该选项,而非-fpic -v 显示详细的编译、汇编、连接命令 -pipe 使用管道代替编译过程中的临时文件...-nostdin C++ 规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,此选项在创建libg++使用。...静态与动态混合链接,有如下两种方法: (1)静态链接使用绝对路径,动态链接使用-l。

14.7K78

CC++生态工具链——gccg++编译使用指南

创建静态的时候,需要使用"gcc/g++ -c"先将xxx.c源文件编译为目标文件xxx.o,然后使用ar指令将xxx.o打包成xxxx.a静态。...GCC在链接优先使用动态,只有当动态不存在才开始使用静态,如果要强制使用静态编译加上-static参数。 使用-Wl,-Bstatic告诉链接器优先使用静态。...动态: 不包含在目标程序中,但是与目标程序相关联。 创建动态的时候,可以传-shared和-fPIC参数,-fPIC参数用于编译阶段,用来生成位置无关的代码。...正因为这种链接方式,共享每次被更新,都不需要重新编译正在使用共享的目标程序。 使用-Wl,-Bdynamic告诉链接器优先使用动态。..., 一般和 -I 联合使用,明确限定头文件的位置 -nostdin C++ #规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建libg++使用 优化参数 -O0 #不优化

2.5K30
  • 如何使用CMake编译RTT微内核

    那么来谈谈为什么不使用scons,采用cmake编译。不是因为scons不好,而是之前作者在写关于cmake的文章中,熊大(RTT的创始人)看到,然后在交流中,熊大说可以采用cmake进行编译。...《CMake,大型项目采用的构建工具》 《CMake 静态与动态构建》 《CMake 教你如何链接共享》 在构建过程中,由于不是很熟悉整个构建流程,在熊大亲自指导下,让我清晰很多。...-nostartfiles -nostdlib -n -pie -fpie -fPIC -fpic -Wl,-pie") set(microkernel_sdk_inc "${CMAKE_SOURCE_DIR...,由于不同源文件添加的编译选项的不同,所以需要分别添加(分别是:C,汇编,C++, 链接),分别如下: set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-...-nostartfiles -nostdlib -n -pie -fpie -fPIC -fpic -Wl,-pie") 如何看我们添加的编译选项是否正确。

    2.1K20

    吴章金: 如何创建一个*可执行*的共享

    先来看看两类文件的区别 当前 Linux 下面的二进制程序标准格式是 ELF,这类格式可以用来表示 4 种不同类型的文件: 可重定位目标文件(.o),用于静态链接 可执行文件格式,用于运行时创建进程映像...共享目标文件(.so,共享),协同可执行文件创建进程映像 Core dump(core),运行过程中崩溃自动生成,用于调试 我们来看中间两类: 可执行文件 如果不引用外部库函数,那么所有符号地址是确定的.../hello.noc hello 通过实验,可以确认“正常”创建出来的共享不能够直接运行,而是需要链接到其他可执行文件中。...如果没有 -rdynamic,链接就没法使用。...\n"); } 当普通共享使用,默认编译即可,要能够执行的话,实现一下 entry(),编译打开 EXEC_SHARED 即可: $ gcc -m32 -shared -fpic -o libhello.so

    1.1K20

    python 调用c语言详解

    同时还能获得与C或者C++几乎相同的执行性能。 Python调用C语言的方式 CTYPES, SWIG, BOOST.PYTHON, CYTHON python是解释型语言,只能调用c的动态链接。...那什么是,什么是静态与动态是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层,不可能每个人的代码都从零开始,因此的存在意义非同寻常。...静态是链接阶段,会将汇编生成的目标文件.o与引用到的一起链接打包到可执行文件中。 动态在程序编译并不会被连接到目标代码中,而是在程序运行是才被载入 为什么需要动态?...如果静态liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户。...创建动态静态 静态 生成.o文件 g++ -c StaticMath.cpp 生成.a文件 ar -crv libstaticmath.a StaticMath.o 动态 For Linux

    3.5K50

    cmake:动态链接(so)中静态链接tcmalloc(gperftools2.4)暨静态链接libstdc++

    tcmalloc.a也可以以静态链接的方式加入应用程序中,大概因为使用太方便,网上关于这方面的介绍都是一笔带过,但是如果要在动态 (so)中静态编译tcmalloc,却是有所不同的。...使用这种方案,我的so代码不需要在编译链接tcmalloc,什么都不用改变,就能使用tcmalloc。...” target_link_libraries(cmimpl -pthread ) #######静态链接c++################### SET_TARGET_PROPERTIES...-shared》),解决这个问题的方法也大同小异,就是根据这个错误提示用-fPIC参数重新编译相关的,这里是就是指要重新编译tcmalloc。...总结 如果在可执行程序中静态链接tcmalloc,用默认参数编译tcmalloc就好了,无需带-fPIC参数, 但是在动态(so)中静态链接tcmalloc,必须要用-fPIC重新编译tcmalloc

    2K10

    c++动态静态的区别_静态库里面包含动态

    ——让大家学会创建使用静态、动态,知道静态与动态的区别,知道使用的时候如何选择。...Windows下创建使用静态 创建静态(.lib) 如果是使用VS命令行生成静态,也是分两个步骤来生成程序: l 首先,通过使用编译器选项 /c 的 Cl.exe 编译代码 (cl /c StaticMath.cpp...如果静态liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。...与创建静态不同的是,不需要打包工具(ar、lib.exe),直接使用编译器即可创建动态。...-fpic g++ -fPIC -c DynamicMath.cpp -fPIC 创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享

    1.9K30

    【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

    (2)优点: • 可以用以前某些程序兼容; • 描述简单; • 允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码的时间(该优势目前已不明显); • 开发者可以对源代码保密;理论上使用ELF...动态在程序编译并不会被链接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本节主要通过举例来说明如何在Linux中创建静态和动态,以及使用它们。...例如:我们将创建静态名为myhello,则静态文件名就是libmyhello.a。在创建使用静态,需要注意这点。 创建静态用ar命令。...这也进一步说明了动态在程序运行时是需要的。 我们回过头看看,发现使用静态使用动态编译成目标程序使用的gcc命令完全一样,那当静态和动态同名,gcc命令会使用哪个文件呢?...在生成动态,需要使用-fPIC,这样才能生成位置无关的代码,达到代码段和数据段共享的目的。

    5K52

    Linux共享静态、动态详解

    一个“程序函数”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数可以使整个程序更加模块化,更容易重新编译,而且更方便升级。...静态库函数允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码的时间。不过,在今天这么快速的计算机面前,一般的程序的重新编译也花费不了多少时间,所以这个优势已经不是像它以前那么明显了。...在用ar命令创建静态库函数的时候,还有其他一些可以选择的参数,可以参加ar的使用帮助。这里不再赘述。 一旦你创建了一个静态函数,你可以使用它了。...创建共享 创建共享很容易。首先,使用gcc -fPIC或-fpic标志创建将进入共享对象文件。-fPIC和-fpic选项可以实现“位置独立代码”生成,这是共享的一个要求; 见下文的差异。...编译生成对象文件(使用-c),并包含所需的-fPIC选项: gcc -fPIC -g -c -Wall ac gcc -fPIC -g -c -Wall bc gcc -shared -Wl,-soname

    8.9K11

    gcc基本命令_cmake 命令

    lib 静态 .i/.ii 经过预处理的 C/C++ 文件 .so/.dll 动态 语法 gcc [options] file......-c :编译和汇编,但不链接。 -o :指定输出文件。 -pie创建一个动态链接、位置无关的可执行文件。 -I :指定头文件的包含路径。 -L :指定链接的包含路径。...-shared :创建共享/动态。 -static :使用静态链接。 --help :显示帮助信息。 --version :显示编译器版本信息。...hello.c 并链接静态 libfoo.a(加上 -static 选项) gcc hello.c -static libfoo.a -o hello 也可以使用 -L 指定的搜索路径,并使用 -.../共享(由于动态可以被多个进程共享加载,所以需要使用 -fPIC 选项生成位置无关的代码 gcc foo.c -shared -fPIC -o libfoo.so hello.c 代码无需修改,内容仍然如下

    73540

    Linux下动态(.so)和静态(.a) 的区别

    当然这也会成为他的缺点,因为如果静态函数改变了,那么你的程序必须重新编译。...,有的UNIX版本C语言编译器默认带上了PIC标准.创建最终动态的方法一般采用C语言编译器的-G或者-shared选项,或者直接使用工具ld创建。...例如将libd2.so换成libd.so 显式调用动态 显式调用动态,编译无需文件,执行时动态可存储于任意位置,库里共享对象必须先申请后使用,不同动态版本,只要其共享对象接口相同,就可以直接动态加载...隐式调用动态静态使用方法一致,使用静态使用动态编译成目标程序使用的gcc命令完全一样,那当静态和动态同名,gcc命令会使用哪个文件呢?...通过测试可以发现,当静态和动态同名, gcc命令将优先使用动态.为了确保使用的是静态, 编译可以加上 -static  选项,因此多第三方程序为了确保在没有相应动态时运行正常,喜欢在编译最后应用程序时加入

    17.1K21

    eclipsecdt:-fPIC引起的线程局部变量(__thread)的SIGSEGV异常问题

    : 一个应用程序A,调用一个静态B,静态中用__thread定义了线程局部变量(TLS,thread local storage),在eclipse跟踪进B的函数,代码执行到访问TLS变量,程序直接就崩溃了...一般来说,程序员在编译自己的c/c++代码是不用关心这个问题的。 然而编译器在编译代码时针对这种不同的访问模型会生成不同的代码。...看到这里我想到了我的静态B在编译指定了-fPIC选项。于是我去掉-fPIC选项重新编译,再跟踪可以通过了。如下图,可以看出,没有-fPIC选项生成的汇编代码与前面有-fPIC选项是不一样的。...虽然到目前为止,我还不知道为什么eclipse下对-fPIC选项编译静态中的TLS调试会造成异常,但总算知道这个问题产生的条件,后续开发中就可以避免了。...导致SIGSEGV异常问题出现是在几个条件下都具备的情况下发生的: 1.静态使用__thread变量 2.静态编译使用了-fPIC选项 3.eclipse调试跟踪静态的代码 参考资料 《3.16

    91010

    Linux的静态和共享详解及实例

    简单的来说,就相当于一个仓库,把你已经写好的功能函数放到中,然后后续需要通过正确的接口去使用相应的功能,当然可以把分享给别人也很方便。...,那么程序就需要重新编译会有些麻烦。        ...首先我们先将这些函数文件编译为.o文件,需要加上-fPIC参数,表示让生成的.o文件与路径无关,这一点主要是用于共享的操作,单纯只用静态的话可以不加。 ?...主版本号的增加就说明了它是不兼容的,需要重新编译链接。...首先我们要对.cpp文件进行编译,那么-fPIC这个命令此时就不能少,表示编译的文件与路径无关,也就是说生成的文件都是相对路径,而不是绝对路径,如果使用绝对路径,那么在多个进程共享使用这个的时候,会根据这个代码段引用的数据对象需要重定位

    3.4K21

    Linux基础IO【软硬链接与动静态

    还是 C++,在编写程序时,一定离不开文件,比如之前模拟实现的 FILE 类型,就位于 stdio.h 这个中,动态优势比静态明显,因此在编译代码,默认采用动态链接的方式,如果想指定为静态链接编译....a 位于 mylib 文件夹中 3.2、静态使用 方法一:通过指定路径使用静态 如果直接编译程序,会出现编译失败的情况,因为编译器不认识第三方(需要提供第三方的路径及名) 第一方:.../mylib -l 待链接静态名 所需要链接的静态名字,这里为 mycalc 将选项加上后重新编译 gcc -o myproc test.c -I./myinclude -L..../mylib -lmycalc 为什么编译 C/C++ 代码,不需要指定路径?...,此时需要加上 -fPIC 与位置无关码 通过 gcc/g++ 直接目标程序(此时不需要使用 ar 归档工具) 将源文件编译为 .o 二进制文件,此时需要带上 fPIC 与位置无关码 gcc -c -fPIC

    30120

    【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态 | Android Studio 中配置使用第三方动态 )

    动态静态 II . 编译动态 III. Android Studio 使用第三方动态 IV . Android Studio 关键代码 V . 博客资源 I ....静态 : 编译链接 , 将整个文件打包到可执行文件中 , 造成可执行文件较大 , 但运行时不需要文件 ; Android 与 Linux 静态 后缀为 “.a” ; 3 ....动态 : 编译链接 , 不将打包入可执行文件中 , 在程序运行时调用到该才链接加载该动态 ; Android 与 Linux 静态 后缀为 “.so” ; 4 ....静态与动态对比 : ① 静态时间效率高 : 执行时没有动态链接的操作 , 所有的代码都在可执行文件内部 , 时间消耗少 ; ② 动态空间效率高 : 动态如果被多个程序调用 , 只要有一个动态在内存中即可...共享动态编译参数 : 编译动态需要添加 “-fPIC” 和 “-shared” 两个参数 ; 3 .

    2.8K20

    你应该了解的JNI知识(一)——静态注册与动态注册

    JNI是什么 Java是支持调用C/C++代码的,不过不能直接调用,因此需要一个中间层来进行转换、翻译,这就是JNI(Java Native Interface)的意思,JNI的作用就是粘合Java代码和...数据类型 JNI是Java特有的东西,是为了打通Java和C/C++代码的一种工具,因此其即不同于Java,又不同于C/C++。...JNIEnv创建了一个字符串,并返回了。...静态注册,每次使用native方法,都要去寻找;而动态注册,由于有张表的存在,因此查找效率高。 编译 上面不管是静态注册方法,还是动态注册方法,都需要将cpp文件编译成平台所需要的。.../jni/DynamicHelloWorld.cpp -o libdynamic.jnilib gcc编译参数说明: -shared:生成一个共享,与静态相对 -I:指定需要包含的头文件 -fPIC

    2.1K20

    Linux从入门到精通(九)——Linux编程

    其中,第一行指令用于安装编译 C 和 C++ 代码所需的静态链接;第二行指令用于安装编译 C 和 C++ 代码的 gcc 和 g++ 指令。...可以生成动态文件 2. 进行动态编译,尽可能地链接动态,只有当没有动态,才会链接同名的静态。...若两个都存在,则根据编译方法(-static/-shared)进行链接。-fPIC(-fpic)生成使用相对地址的位置无关的目标代码( Position Independent Code ) 。...5.5 文件的创建 文件的分类: 静态文件: 指编译链接,把文件的代码全部加入到可执行文件中,生成的可执行文件变大,运行时不再需要文件,后缀一般a。...静态文件的创建(见例2): 编写源代码:xxx.c 编译成一个目标文件:xxx.o 执行命令,产生静态文件: ar -cr libxxx.a xxx.o 动态文件的创建(见例3): 编写源代码:xxx.c

    2K30

    小记最近踩得两个C++

    小记最近踩得两个C++坑 记一下最近踩得两个C++有的暗坑,其中一个和ABI相关。第二个坑其实之前研究过,但是没有实例,这次算是碰到了个典型的实例。...坑二:Linux环境下共享静态的问题 这个问题之前就提及过《C++又一坑:动态链接中的全局变量》现在则是碰到了更有代表性的实例。 我们的程序框架和逻辑模块的关系是。...如果要编写一个可以供其他多个模块使用(即不保证一个应用程序及其所依赖的动态链接库里链接这个的次数总和<=1的情况下),应该符合下面的条件: 编译的时候尽量使用动态链接(带-fPIC) 如果一定要使用静态...,则库里不能使用全局变量或静态局部变量 如果实在不能避免使用全局或静态变量,这些变量必须是POD类型且一定不能有构造初始化 因为条件2的原因,所以也基本和单例模式说ByeBye了 条件1的目的是,每个程序载入动态链接之后再程序中只有一份地址空间...而是用静态,数据只有一份,代码却有多份。

    51220

    小记最近踩得两个C++

    小记最近踩得两个C++坑 记一下最近踩得两个C++有的暗坑,其中一个和ABI相关。第二个坑其实之前研究过,但是没有实例,这次算是碰到了个典型的实例。...坑二:Linux环境下共享静态的问题 这个问题之前就提及过《C++又一坑:动态链接中的全局变量》现在则是碰到了更有代表性的实例。 我们的程序框架和逻辑模块的关系是。...如果要编写一个可以供其他多个模块使用(即不保证一个应用程序及其所依赖的动态链接库里链接这个的次数总和<=1的情况下),应该符合下面的条件: 编译的时候尽量使用动态链接(带-fPIC) 如果一定要使用静态...,则库里不能使用全局变量或静态局部变量 如果实在不能避免使用全局或静态变量,这些变量必须是POD类型且一定不能有构造初始化 因为条件2的原因,所以也基本和单例模式说ByeBye了 条件1的目的是...而是用静态,数据只有一份,代码却有多份。

    1.5K31
    领券