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

如何在可重定位的共享库中推送堆栈中的标签,它的哪些对象应该用-fPIC编译?

在可重定位的共享库中推送堆栈中的标签,可以通过使用函数指针来实现。函数指针是指向函数的指针变量,可以将函数的地址赋值给函数指针,然后通过调用函数指针来执行相应的函数。

在C/C++中,可以使用-fPIC(Position Independent Code)选项来编译可重定位的共享库。-fPIC选项告诉编译器生成与位置无关的代码,这样共享库可以在内存中的任意位置加载并执行,而不会受到地址空间的限制。

在编译共享库时,应该使用-fPIC选项编译那些需要在运行时进行地址重定位的对象,例如全局变量、静态变量、静态函数等。这些对象在编译时无法确定其最终的地址,因此需要使用位置无关的代码。

以下是一些应该使用-fPIC编译的对象:

  1. 全局变量:全局变量在共享库中的地址是不确定的,因此需要使用-fPIC编译。
  2. 静态变量:静态变量在共享库中的地址也是不确定的,需要使用-fPIC编译。
  3. 静态函数:静态函数在共享库中的地址同样是不确定的,需要使用-fPIC编译。
  4. 使用全局变量的函数:如果一个函数使用了全局变量,那么该函数也需要使用-fPIC编译,以确保全局变量的地址可以正确地被重定位。
  5. 使用静态变量的函数:如果一个函数使用了静态变量,那么该函数也需要使用-fPIC编译,以确保静态变量的地址可以正确地被重定位。

需要注意的是,使用-fPIC编译会增加一些额外的开销,因此在编译时需要权衡性能和可移植性的需求。

腾讯云提供了一系列云计算相关的产品,包括云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据具体需求和场景来选择,可以参考腾讯云的官方文档或咨询腾讯云的技术支持团队获取更详细的信息。

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

相关·内容

地址无关码

这种情况与我们碰到问题很相似,都是程序模块在编译时目标地址不确定而需要在装载时将模块定位。但是装载时定位方法并不适合用来解决上面的共享对象中所存在问题。...当然,动态连接修改数据部分对于不同进程来说有多个副本,所以它们可以采用装载时定位方法来解决。...Linux和GCC支持这种装载时定位方法,我们前面在产生共享对象时,使用了两个GCC参数“shared”和“-fPIC”,如果只使用“- shared”,那么输出共享对象就是使用装载时定位方法...我们还需要有一种更好方法解决共享对象指令对绝对地址定位问题。...但是装载时定位共享对象运行速度要比使用地址无关代码共享对象快,因为省去了地址无关代码每次访问全局数据和函数时需要做一次计算当前地址以及间接地址寻址过程 对于可执行文件来说,默认情况下,如果可执行文件是动态链接

97220

含大量图文解析及例程 | Linux下ELF文件、链接、加载与

可执行文件程序头表 我们用readelf -h [fileName]命令查看一个可执行ELF文件ELF头时,会发现与定位ELF文件ELF头有一个重大不同:定位文件ELF头中 Start of...动态链接例子 假如我们要制作一个关于向量动态链接libvector.so,包含两个源代码addvec.c和multvec.c如下:我们只需要这样来进行编译: gcc -shared -fpic...-o libvector.so addvec.c multvec.c 其中-fpic选项告诉编译器生成位置无关代码(PIC),而-shared选项告诉编译器生成共享。...关键技术 之前在静态链接过程我们提到过重定位过程,那个时候其实属于链接时定位,现在我们需要装载时定位 ,主要使用了以下关键技术: PIC位置无关代码 GOT全局偏移表 GOT配合PLT实现延迟绑定技术...动态链接器本身也是.so文件,但是它比较特殊,它是静态链接。本身不依赖任何其他共享对象也不能使用全局和静态变量。这是合理,试想,如果动态链接器都是动态链接的话,那么由谁来完成动态链接呢?

2.5K21

Linux编译相关命令

-fPIC -shared hello.cpp -o libmyhello.so (5)使用动态 动态时候和静态使用一样,唯一值得注意是当目录同时存在相同名称动态和静态时...,编译时候优先使用动态 2、fPIC选项 加上fPIC选项生成动态时位置无关,可以实现多个进程共享动态,多个进程引用同一个PIC动态时,可以共享内存。...不加fPIC,则加载so文件时,需要对代码段引用数据对象需要定位定位会修改代码段内容,这就造成每个使用这个.so文件代码段进程在内核里都会生成这个.so文件代码段copy.每个copy都不一样...3、如何解决运行时找不到动态问题 (1)将动态添加到系统默认搜索路径下,/lib、/usr/lib (2)设置临时动态路径环境变量,这种方法设置是临时,系统重启之后就没了...,可以通过修改配置文件/etc/ld.so.conf中指定动态搜索路径,然后执行ldconfig命令来改变 (4)编译链接添加-WL,-rpath命令选项,将运行时动态搜索路径记录在可执行程序

3.3K00

前端学习知识体系

,手动实现一个 instanceof 3.实现继承几种方式以及他们优缺点 4.至少说出一种开源项目( Node)应用原型继承案例 5.可以描述 new一个对象详细过程,手动实现一个 new操作符...,可以应用堆栈信息快速定位问题 4.this 绑定,call、apply、bind 原理 5.闭包实现原理和作用,可以列举几个开发闭包实际应用 6.如何处理循环异步操作 7.理解模块化解决实际问题...五、运行环境 我们需要理清语言和环境关系:ECMAScript描述了 JavaScript语言语法和基本对象规范浏览器作为 JavaScript一种运行环境,为提供了:文档对象模型( DOM)...10.浏览器跨标签通信 浏览器原理 1.各浏览器使用 JavaScript 引擎以及它们异同点、如何在代码中进行区分 2.请求数据到请求结束与服务器进行了几次交互 3.详细描述浏览器从输入 URL...1.熟练掌握一种接口管理、接口 mock工具使用, yapi 2.掌握一种高效日志埋点方案,快速使用日志查询工具定位线上问题 3.理解 TDD与 BDD模式,至少会使用一种前端单元测试框架 版本控制

1.9K10

无需 sendmail:巧用 LD_PRELOAD 突破 disable_functions

linux 创建新进程过程较为复杂,我关心进程加载了哪些共享对象、可能调用哪些 API、实际调用了哪些 API。比如,运行 /usr/bin/id,通过 ldd 可查看系统为其加载共享对象: ?...执行 gcc -shared -fPIC getuid_shadow.c -o getuid_shadow.so 将其编译共享对象: ?...web 是否跨目录访问、文件将被覆盖和删除等几点;三是 sopath 参数,指定劫持系统函数共享对象绝对路径( /var/www/bypass_disablefunc_x64.so),另外关于该参数...,你注意 web 是否跨目录访问到。...几经搜索后了解到,GCC 有个 C 语言扩展修饰符 _attribute((constructor)),可以让由修饰函数在 main() 之前执行,若出现在共享对象时,那么一旦共享对象被系统加载

2K10

动态链接步骤与实现

动态链接器自举 我们知道动态链接器本身也是一个共享对象,但是事实上它有一些特殊性。对于普通共享对象文件来说,定位工作由动态链接器来完成。...他也可以依赖其他共享对象,其中被依赖共享对象由动态链接器负责链接和装载。可是对于动态链接器来说,定位工作由谁来完成?它是否可以依赖于其他共享对象?...其实我们在前面分析地址无关代码时已经提到过,实际上使用PIC模式编译共享对象,对于模块内部函数调用也是采用跟模块外部函数调用一样方式,即使用 GOT/PLT方式,所以在 GOT/PLT没有被定位之前...然后链接器开始寻找执文件所依赖共享对象,我们前面提到过“.dynamic”段,有一种类型入口DT_NEEDED,它所指出是该可执行文件(或共享对象)所依赖共享对象。...定位完成之后,如果某个共享对象有“.init”段,那么动态链接器会执行“.init”段代码,用以实现共享对象特有的初始化过程,比如最常见,共享对象C++ 全局静态对象构造就需要通过“init

1.3K20

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

: 如何让共享文件也可以直接执行 如何在可执行文件中用 dlopen 解析自身函数 这两个需求汇总起来,可以大体理解为如何让一个程序既可以作为共享,又能够直接运行。...先来看看两类文件区别 当前 Linux 下面的二进制程序标准格式是 ELF,这类格式可以用来表示 4 种不同类型文件: 定位目标文件(.o),用于静态链接 可执行文件格式,用于运行时创建进程映像.../hello hello 再来编译共享目标文件,并尝试直接执行: $ gcc -m32 -shared -fpic -o libhello.so hello.c $ file libhello.so.../hello.noc hello 通过实验,可以确认“正常”创建出来共享并不能够直接运行,而是需要链接到其他可执行文件。...\n"); } 当普通共享使用,默认编译即可,要能够执行的话,实现一下 entry(),编译时打开 EXEC_SHARED 即可: $ gcc -m32 -shared -fpic -o libhello.so

1.1K20

前端技能自检

下面我会把我自检清单分享给大家,你可以按照清单上知识检测自己还有哪些不足和提升,我也建议大家构建自己知识体系,这样工作或者学习甚至面试时,你能快速定位到知识清单点。 ?...变量和类型 JavaScript规定了几种语言类型 JavaScript对象底层数据结构是什么 Symbol类型在实际开发应用、手动实现一个简单 Symbol JavaScript变量在内存具体存储形式...JavaScript作用域和作用域链 理解 JavaScript执行上下文栈,可以应用堆栈信息快速定位问题 this原理以及几种不同使用场景取值 闭包实现原理和作用,可以列举几个开发闭包实际应用...解析、去等)解决常见问题 JavaScript异常处理方式,统一异常处理方案 二、HTML和CSS HTML 从规范角度理解 HTML,从分类和语义角度使用标签 常用页面标签默认样式、自带属性..., Polyfill Webpack编译原理、构建流程、热更新原理, chunk、 bundle和 module区别和应用 熟练配置已有的 loaders和 plugins解决问题,可以自己编写

3K21

【前端】219-一名合格前端工程师自检清单,建立自己前端知识体系

你可以按照清单上知识检测自己还有哪些不足和提升,也建议大家学着建立起自己知识体系,这样在工作、学习甚至面试时,你能快速定位到对应知识点,如果你有哪些作者没归纳到问题,我们评论区见~! ?...变量和类型 1.JavaScript规定了几种语言类型 2.JavaScript对象底层数据结构是什么 3.Symbol类型在实际开发应用、手动实现一个简单Symbol 4.JavaScript...: ECMAScript描述了JavaScript语言语法和基本对象规范 浏览器作为JavaScript一种运行环境,为提供了:文档对象模型(DOM),描述处理网页内容方法和接口、浏览器对象模型...接口mock工具使用,yapi 2.掌握一种高效日志埋点方案,快速使用日志查询工具定位线上问题 3.理解TDD与BDD模式,至少会使用一种前端单元测试框架 版本控制 1.理解Git核心原理...H5等等) 项目和业务 后端技能 1.了解后端开发方式,在应用程序作用,至少会使用一种后端语言 2.掌握数据最终在数据是如何落地存储,能看懂表结构设计、表之间关联,至少会使用一种数据

1.2K30

程序如何运行:编译、链接、装入

装入模块虽然具有统一地址空间,但它仍是以“0”作为参考地址,即是浮动。要把装入内存执行,就要确定装入内存实际物理地址,并修改程序与 地址有关代码,这一过程叫做地址定位。...2.静态地址定位定位装入方式 Relocation Loading Mode) 绝对装入方式只能将目标模块装入到内存事先指定位置。...此时采用定位装入方式,根据内存的当前情况,将装入模块装入到内存适当位置。...值得注意是, 在采用定位装入程序将装入模块装入内存后, 会使装入模块所有逻辑地址与实际装入内存物理地址不同,图4-3示出了这一情况。...•程序文件 .C:相当于给出一组函数定义源代码; •模块定义文件 .DEF:相当于定义链接选项,也可在源代码定义;:DLL函数引入和引出(dllimport和dllexport

1.6K10

动态链接相关结构

,即“.interp”段指定路径共享对象; 动态链接器在linux下是glibc一部分,也就是属于系统级别的,版本号往往跟系统Glibc版本号是一样,比如我系统安装是glibc...,比如依赖于哪些共享对象、动态链接符号表位置、动态链接定位位置、共享对象初始化代码地址等。...另外linux还提供了一个命令用来查看一个程序主模块或一个共享依赖于哪些共享: ? 动态符号表 为了完成动态链接,最关键还是所依赖符号和相关文件信息。...对于动态链接来说,如果一个共享对象不是以PIC模式编译,那么毫无疑问,它是需要在装载时被定位:如果一个共享对象是PIC模式编译,那么它还需要再装载时进行定位吗?...动态链接定位相关结构 共享对象定位与我们在前面“静态链接”中分析过目标文件定位十分类似,唯一有区别的是目标文件定位是在静态链接时完成,而共享对象定位是在装载时完成

1.7K20

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

dll:是实际运行二进制代码,有定位代码!...动态在程序编译时并不会被链接到目标代码,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。本节主要通过举例来说明如何在Linux创建静态和动态,以及使用它们。...程序照常运行,静态公用函数已经链接到目标文件中了。 我们继续看看如何在Linux创建动态。我们还是从.o文件开始。...如果不加fPIC,则编译出来代码在加载时需要根据加载到位置进行定位(因为里面的代码并不是位置无关代码),如果被多个应用程序共同使用,那么它们必须每个程序维护一份so代码副本了。...(因为so被每个程序加载位置都不同,显然这些定位代码也不同,当然不能共享)。

4.2K52

小心两个共享共用同一个静态

.html(Linux上制作可执行共享示例) 问1:如果测试全局变量global_var是个带构造和析构对象,会如何?...(答案在最后) 问2:如果使用-fPIE替代-fPIC编译链接,会是什么结果了?...原因是在使用dlopen动态加载共享时,如果静态包含有全局变量,可能会出现名同地址不同全局变量。 解决办法:总是使用RTLD_GLOBAL加载共享,而不是RTLD_LOCAL。...-Wl,-rpath=/usr/local/abc -Wl,-rpath=/data/abc 部分库链接静态,部分库链接共享: -Wl,-static...表示不丢弃未定义符号和需要定位符号 --export-dynamic 创建一个动态连接可执行程序时, 把所有的符号加到动态符号表

2.6K50

linux下 lib文件学习思考

ldd 是Library Dependency Display缩写,作用是显示一个可执行程序必须使用共享 。...(1)命令格式 ldd [选项] 文件名 (2)主要参数 -d 执行定位并报告丢失函数。 -r 执行对函数和数据对象定位,并报告丢失函数和数据对象。...2.ldconfig ldconfig 命令作用是决定位于目录/usr/lib和/lib下共享所需运行链接。这些链接保存在Libs保存在/et/ld.so.conf文件。...搜 索出共享动态链接(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需链接和缓存文件。...(3)应用实例  如果用户想知道系统中有哪些动态链接,或者想知道系统中有没有某个动态链接时,可用-p选项让ldconfig输出缓存文件动态链接列表,从而查询得到。

2.5K20

Linux编译工具:gcc入门

汇编器生成定位目标文件,学过操作系统,我们知道,在源程序地址是从0开始,这是一个相对地址,而程序真正在内存运行时地址肯定不是从0开始,而且在编写源代码时候也不能知道程序绝对地址,...所以定位能够将源代码代码、变量等定位为内存具体地址。...hello.c 或 gcc -c hello.c -o hello.o 编译生成定位目标文件 使用gcc时可以加上-Wall选项。...使用优点在于: 模块化开发 重用性 可维护性 又可以分为静态与动态: 静态(.a):程序在编译链接时候把代码链接到可执行文件。程序运行时候将不再需要静态。...fPIC表示产生位置无关码(position independent code),位置无关码表示运行、加载与内存位置无关,可以在任何内存地址进行加载。 9.

4.7K50

一名【合格】前端工程师自检清单

下面我会把我自检清单分享给大家,你可以按照清单上知识检测自己还有哪些不足和提升,我也建议大家建自己知识体系,这样工作或者学习甚至面试时,你能快速定位到知识清单点,如果你有哪些我没归纳到点,欢迎在评论区告诉我...JavaScript对象底层数据结构是什么 3. Symbol类型在实际开发应用、手动实现一个简单 Symbol 4.....理解 JavaScript作用域和作用域链 3.理解 JavaScript执行上下文栈,可以应用堆栈信息快速定位问题 4. this原理以及几种不同使用场景取值 5.闭包实现原理和作用...ECMAScript描述了 JavaScript语言语法和基本对象规范 浏览器作为 JavaScript一种运行环境,为提供了:文档对象模型( DOM),描述处理网页内容方法和接口、浏览器对象模型...Node在应用程序作用,可以使用 Node搭建前端运行环境、使用 Node操作文件、操作数据等等 2.掌握一种 Node开发框架, Express, Express和 Koa区别

93121

一名【合格】前端工程师自检清单

下面我会把我自检清单分享给大家,你可以按照清单上知识检测自己还有哪些不足和提升,我也建议大家建自己知识体系,这样工作或者学习甚至面试时,你能快速定位到知识清单点,如果你有哪些我没归纳到点,欢迎在评论区告诉我...JavaScript对象底层数据结构是什么 3. Symbol类型在实际开发应用、手动实现一个简单 Symbol 4.....理解 JavaScript作用域和作用域链 3.理解 JavaScript执行上下文栈,可以应用堆栈信息快速定位问题 4. this原理以及几种不同使用场景取值 5.闭包实现原理和作用...ECMAScript描述了 JavaScript语言语法和基本对象规范 浏览器作为 JavaScript一种运行环境,为提供了:文档对象模型( DOM),描述处理网页内容方法和接口、浏览器对象模型...Node在应用程序作用,可以使用 Node搭建前端运行环境、使用 Node操作文件、操作数据等等 2.掌握一种 Node开发框架, Express, Express和 Koa区别

1K30

Linux静态共享详解及实例

本质上是一个可执行二进制文件,但是并不能独立执行。...而共享以.so为后缀,实现方式是在链接过程不会将载入到程序,而是生成一个记录表,当程序运行时候再去通过记录表去链接共享,那么这个好处就是程序体积小,而且当有不同程序公用一个时候...首先我们先将这些函数文件编译为.o文件,需要加上-fPIC参数,表示让生成.o文件与路径无关,这一点主要是用于共享操作,单纯只用静态的话可以不加。 ?...首先我们要对.cpp文件进行编译,那么-fPIC这个命令此时就不能少,表示编译文件与路径无关,也就是说生成文件都是相对路径,而不是绝对路径,如果使用绝对路径,那么在多个进程共享使用这个时候,会根据这个代码段引用数据对象需要定位..., 定位会修改代码段内容,这就造成每个使用这个.so文件代码段进程在内核里都会生成这个.so文件代码段copy,那么就相当于每个进程都维护了一个自己.so副本,因此就做不到共享了。

3.3K20

后台开发:核心技术与应用实践 -- 编译与调试

o 文件,链接器拿一个或一些定位目标文件作为输入,经链接处理后,生成一个可执行目标文件或者一个可被共享对象文件(.so 文件)。...链接器拿它和其他定位文件( .o 文件)以及其他 .so 文件作为输入,经链接处理后,生成另外共享目标文件( .so 文件)或者可执行目标文件;2....组成不同定位文件,以参与可执行文件或者可被共享对象文件链接。2. 组成可执行文件或者可被共享对象文件,以在运行时内存中进程映像构建。构建对象文件组成如表: ?...结果展示了, add.o、sub.o 都是定位文件, libmymath.so 是可被共享文件, main是可执行文件 减少目标文件大小工具一一 strip 它能清除执行文件不必要标示符及调试信息...堆具体内容由程序员安排 常见内存动态管理错误包括以下几种: 申请和释放不一致 申请和释放所使用函数需匹配,new申请空间使用delete释放,而malloc申请空间使用free释放

74310

【图片+代码】:Linux 动态链接过程定位】底层原理

在上一篇文章,我们一起学习了Linux系统 GCC编译器在编译可执行程序时,静态链接过程是如何进行符号定位。 为了完整性,我们这篇文章来一起探索一下:动态链接过程是如何进行符号定位。...; 编译成动态链接 把以上几个源文件编译成动态以及可执行程序: $ gcc -m32 -fPIC --shared b.c -o libb.so $ gcc -m32 -fPIC --shared...因为在编译时候,需要知道每一个动态中提供了哪些符号。...可以看到:在全局符号表,没有找到liba.so变量a1和函数func_a2这两个符号,因为俩都是static类型,在编译成动态时候,没有导出到符号表。...并且,在一个动态文件,有两个特殊段(.rel.dyn和.rel.plt)来告诉链接器:.got和.got.plt这两个表,有哪些符号需要进行定位,这个问题下面会深入讨论。

1.9K11
领券