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

aarch64-elf-g++ -fPIC为局部符号和全局符号提供不同的值

aarch64-elf-g++是一个编译器,用于将C++代码编译成适用于aarch64架构的目标文件。-fPIC是编译选项,用于生成位置无关代码(Position Independent Code,PIC)。位置无关代码是一种可在内存中的任何位置加载和执行的代码,它不依赖于特定的内存地址。-fPIC选项为局部符号和全局符号提供不同的值,具体如下:

  1. 局部符号:局部符号是在一个源文件中定义的,并且只在该文件中可见。对于局部符号,-fPIC选项会将其绑定到相对地址,使得它们可以在内存中的任何位置加载和执行。这种绑定方式使得目标文件更加灵活,可以与其他目标文件进行动态链接。
  2. 全局符号:全局符号是在多个源文件之间共享的符号,可以被其他源文件引用。对于全局符号,-fPIC选项会将其绑定到绝对地址,以便其他源文件可以正确地引用它们。这种绑定方式确保了全局符号在内存中的唯一性,避免了重复定义和冲突。

总结起来,-fPIC选项为局部符号和全局符号提供不同的绑定方式,使得生成的目标文件可以在内存中的任何位置加载和执行,并且可以正确地引用其他源文件中的全局符号。这在构建动态链接库(Dynamic Link Library,DLL)或可执行文件时非常有用。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云计算产品:https://cloud.tencent.com/product
  • 腾讯云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云云原生应用引擎(Tencent Cloud Native Application Engine):https://cloud.tencent.com/product/tcnae
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(Mobile Development):https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(Blockchain):https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/mv
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

下载测试代码: x.zip(帖子不同,x.zip包中全局变量是个类对象,带有构造析构函数) 推荐阅读:http://blog.chinaunix.net/uid-20682147-id-351108...位置无关代码(PIC)对常量函数入口地址操作都是采用基于基寄存器(base register)BASE+ 偏移量相对地址寻址方式,即使程序被装载到内存中不同地址(即 BASE不同),而偏移量是不变...原因是在使用dlopen动态加载共享库时,如果静态库中包含有全局变量,可能会出现名同地址不同全局变量。 解决办法:总是使用RTLD_GLOBAL加载共享库,而不是RTLD_LOCAL。...段表(Section Table) 一个描述文件中各个段数组 .code/.text 代码段 .data 段保存是那些已经初始化了全局静态变量和局部静态变量 .rodata/.rodata1...段存放是只读数据,一般是程序里面的只读变量(如const修饰变量)字符串常量 .bss 段存放是未初始化全局变量和局部静态变量 .plt/.got 段动态链接跳转表全局入口表 .symtab

2.6K50

静态链接库动态链接库区别

1、动态库构造析构函数机制在Linux中,提供了一个机制:在加载卸载动态库时,可以编写一些函数,处理一些相应事物,我们称这些函数动态库构造析构函数,其代码格式如下:void __attribute...注意,构造函数参数必须空,返回也必须空。...使用G++对其进行编译:g++ -fPIC -shared b1.c -o libb.so编译成功!可见GCCG++对于这种全局变量初始化方法,支持力度是不一样。...函数dlerror:原型: const char *dlerror(void);当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回NULL时表示操作函数执行成功。...函数dlsym : 取函数执行地址原型: void *dlsym(void *handle, char *symbol);dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应函数执行代码地址

7.9K21

动态链接步骤与实现

符号优先级 在动态链接器按照各个模块之间依赖关系,对它们进行装载并且将它们符号并入到全局符号表时,会不会有这么一种情况发生,那就是有可能不同模块定义了同一个符号?....c中都定义了名字a函数,那么由于b1.cb2.c都用到了外部函数“a”,但由于源代码中没有指定依赖于哪一个共享对象中函数“a”,所以我们在编译时指定依赖关系。...、a1.soa2.so都会被装载到进程地址空间,并且它们中符号都会被并入到全局符号表,通过查看进程地址空间信息可以看到: ?...由于存在这种重名符号被直接忽略问题,当程序使用大量共享对象时应该非常小心符号重名问题,如果两个符号重名又执行不同功能,那么程序运行时可能会将所有该符号引用解析到第-个被加入全局符号使用该符号符号...Windows系统中EXEDLL也是类似的区别,DLL也可以被当作程序来运行, Windows提供了一个叫做rund32exe工具可以把一个DLL当作可执行文件运行。

1.3K20

Opentelemetry社区在gRPC几个链接问题(静态库动态库混用,musl工具链,符号裁剪)

这种情况如果我们把 gRPC 编译成静态库,并链接进多个动态库里,那么每个动态库里都有一份 gRPC 全局变量函数符号。...在Windows中,由于每个dll有自己独立符号堆管理,如果多个模块间没有互相访问,那么这种重复是没有关系,因为每个模块访问都是自己那一份全局变量(当然如果这个全局变量想表达单例的话,那么他可能不是一个真正单例...而对于全局变量,却是每个模块里面都存在单独实体,每个都会去执行构造函数,并且由于默认选中符号是相同,所以导致执行构造函数地址也是相同,这就会导致问题。...这么做有两个好处,第一是存在多份符号时候因为总会调用第一次载入符号接口,那么能保证访问到总是同一份变量,并且还减少了不必要构造析构带来内存或CPU开销。...总结 上面的问题本质上还是动态库和静态库混合使用问题。由于不同操作系统ABI行为不一样,导致很难有大一统方法去解决这些问题。也属于C++历史包袱大家会觉得“难”地方之一吧。

37220

Linux共享库、静态库、动态库详解

环境变量 各种各样环境变量控制着一些关键过程。例如你可以临时你特定程序一次执行指定一个不同函数库。...将LD_DEBUG设置“bindings”显示有关符号绑定信息,将其设置“libs”,显示库搜索路径,并将ti设置“`versions”显示版本依赖。...加载程序通过检查程序凭据来确定程序是否被setuid或setgid; 如果uideuid不同,或者gidegid不同,那么加载器会假定程序是setuid / setgid(或者从一个下降),因此极大地限制了其控制链接能力...首先,使用gcc -fPIC或-fpic标志创建将进入共享库对象文件。-fPIC-fpic选项可以实现“位置独立代码”生成,这是共享库一个要求; 见下文差异。...使用-fpic选项通常会生成更小更快代码,但会有平台相关限制,例如全局可见符号数量或代码大小。链接器将告诉您,创建共享库时是否适合。如果有疑问,我选择-fPIC,因为它总是有效。

8.7K10

C语言:如何给全局变量起一个别名?

请注意:这里所讨论别名,仅仅是通过不同标识符来引用同一个变量。 与强符号、弱符号概念没有任何关系,那是另一个话题。 在上面这个帖子中,作者首先想到是通过宏定义,对变量进行重新命名。...本文提供两个方法来实现这个目的,并通过两个简单示例代码来进行演示。 文末有示例代码下载地址。...其中有个反向注册想法,正好可以用在变量别名上面。 示例代码中一共有 2 个文件:main.cplugin.c。 main.c中定义了一个全局变量数组,编译成可执行程序main。...在plugin.c中,提供一个函数func_init,当动态库被main dlopen之后,这个函数就被调用,并且把真正全局变量地址通过参数传入。...这样的话,在插件中就可以通过一个别名来使用真正变量了(比如:修改变量)。 本质上,这仍然是通过指针来进行引用。 只不过利用动态注册思想,把指针与变量绑定关系在时间空间上进行隔离。

1.2K20

《程序员自我修养》第三章学习笔记

描述文件各个段数组(各个段在文件中偏移属性)。 5,  关于bss段:未初始化全局变量和静态局部变量一般放在一个”.bss”段地方。...它只是未初始化全局变量和静态局部变量预留位置而已,并没有内容,在文件中不占空间。 6,  总体来说:程序源代码被编译后主要分成两种段:程序指令(代码段),程序数据(数据段,bss段)。...3.3.2数据段只读数据段 1, “.data” :保存是已初始化全局变量和局部静态变量 2,,”rodata”:存放是只读数据,一般是程序中只读变量(如用const修饰字符串常量。...对于变量或函数来说,符号就是它们地址。 8,  符号分类: (1)(2)比较需要关注 (1)       定义在本目标文件全局符号,可被其他目标文件引用。...3.5.5 弱符号与强符号 1,多个目标文件含有相同名字全局符号定义,在链接时将会出现符号重复定义错误。 2,编译器默认函数初始化了全局变量符号,未初始化全局变量符号

1.1K60

解决动态库符号冲突

TIPS:可以简单使用linux命令 nm 查看程序里有哪些函数 动态库符号表 尽管程序各不相同,但总有些功能很常见。...动态库加载之前,谁都不知道它会被加载到哪里,也就不知道动态库里指令地址,只能通过符号(名称)来记录它提供给别人用函数列表(导出表),以及它期望别人提供给他函数列表(导入表)。...程序运行前,需要先解析符号表,确定每个符号实际地址。...符号有关编译器选项环境变量选项 如果条件允许,尽量不要在同一个程序中出现两份代码,出现相同符号情况,造成冲突。...plugin.so 可通过 gcc -Wl,-Bsymbolic选项告诉加载器优先使用自己符号,而不优先用全局符号。该选项可以解决符号冲突。

2.2K30

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

= %d \n", b); } 代码说明: 定义一个全局变量一个全局函数,被 a.c 调用。...a.c 代码如下(稍微复杂一些,主要是为了探索:不同类型符号如何处理重定位): #include // 内部定义【静态】全局变量 static int a1 = 10; //...因为在编译时候,需要知道每一个动态库中提供了哪些符号。...可以看到:在全局符号表中,没有找到liba.so中变量a1函数func_a2这两个符号,因为它俩都是static类型,在编译成动态库时候,没有导出到符号表中。...对于动态链接来说,也是通过两个重定位表来传递需要重定位符号信息,只不过名字有些不同:.rel.dyn.rel.plt。

1.8K11

C语言——B数据类型变量

例如: int age = 18; char ch = 'w'; 2.1、全局变量 在大括号外部定义变量就是全局变量;全局变量使用范围广,在整个工程中都可以使用; 2.2、局部变量 在大括号内部定义变量就是局部变量...局部变量不初始化时,里面的会是随机。 ***当局部变量与全局变量名字相同时,局部变量优先使用。...} 全局变量和局部变量在内存中存储在哪⾥呢?...进入代码块,自动形成局部变量,退出代码块自动释放。 全局变量:在所有函数外定义变量,叫做全局变量。全局变量具有全局性。...4、赋值忽略符 当输入格式有可能与预定格式不同时,scanf() 解析数据就会失败。 为了避免这种情况, scanf() 提供了⼀个赋值忽略符 * 。

9610

论文Express | AI智商(IQ)怎么测?这其实是个策略比赛

我们定义了全局IQ和局部IQ概念。AI全局IQ更准确,但却无法精确计算(因为组合爆炸问题)。AI局部IQ并不准确,因为它取决于测试中特定任务选择。...设备行为可以表示一种策略,即作为一个定义设备每一次生命开始,下一次动作函数,同样地,世界行为也可以作为一种策略来呈现,设备每一种生命开始,每一种行为都提供了奖励观察,设备将会在下一个步骤中得到它们...最后,我们将计算胜利,失败,平局数量,并获得算术平均IQ,其中胜利1,失败0,平局1/2。...获得结果会接近全局IQ。 这种方法问题是不同测试世界选择会产生不同全局IQ近似。我们需要是奖励给待测程序对应IQ,因为它必须是一个特定而不是近似。...以此类推,可以构建第三个甚至第四个局部IQ。 我们给出全局IQ定义: 在这个式子中,P(TM|interesting):如果世界有趣,机器TM被选中条件概率。

44441

小白入门笔记:CMake编译过程详解

具体使用方式在设置变量时只需使用set()并提供名称,要取消变量设置时可以使用unset()并提供名称。...回归本质,CMake变量作用域作为一个通用概念是为了分离不同抽象层,以便在调用用户定义函数时,该函数中设置变量是局部,这些局部变量不会影响全局作用域,即使局部变量名称与全局变量名称完全相同。...该变量默认为空,CMake识别的: • Debug:用于在没有优化情况下,使用带有调试符号构建库或可执行文件。 • Release:用于构建优化库或可执行文件,不包含调试符号。...编程语言有不同标准,即提供改进语言版本。...变量设置相应

4.4K31

超全 | 只有高手才知道C语言高效编程与代码优化方法(一)

由于需要移位到0负数,有符号signed除法需要更多时间执行。 取模一种替代方法 我们使用取余数操作符来提供算数取模。但有时可以结合使用if语句进行取模操作。...使用指针或者函数调用,可以直接修改全局变量。 因此,编译器不能将全局变量缓存在寄存器中,但这在使用全局变量时便需要额外(常常是不必要)读取存储。...所以,在重要循环中我们不建议使用全局变量。 如果函数过多使用全局变量,比较好做法是拷贝全局变量局部变量,这样它才可以存放在寄存器。 这种方法仅仅适用于全局变量不会被我们调用任意函数使用。...对于charshort类型,编译器需要在每次赋值时候将局部变量减少到8或者16位。 这对于有符号变量称之为有符号扩展,对于无符号变量称之为零扩展。...可以通过使用intunsigned int类型局部变量来避免这样移位操作。 这对于先加载数据到局部变量,然后处理局部变量数据这样操作非常重要。

5.7K21

《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接

多年以来,链接都被认为是相当简单无趣然而,随着共享库动态链接在现代操作系统中重要性日益加强,链接成为一个复杂过程,掌握它程序员提供了强大能力。...运行时,在内存中分配这些变量,初始0。 防止恶意转载 版权声明:本文博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接本声明。...实际上,每个可重定位目标文件在. symtab中都有一张符号表(除非程序员特意用 STRIP命令去掉它)。然而,编译器中符号不同, symtab符号表不包含局部变量条目。...符号符号表   每个可重定位目标模块m都有一个符号表,它包含m定义引用符号信息。在链接器上下文中,有三种不同符号:   由模块m定义并能被其他模块引用全局符号。...全局链接器符号对应于非静态C函数全局变量。   由其他模块定义并被模块m引用全局符号。这些符号称为外部符号,对应于在其他模块中定义非静态C函数全局变量。   只被模块m定义引用局部符号

2.6K31

ELF文件及android hook原理

链接视图执行视图 ELF文件在磁盘中和被加载到内存中并不是完全一样,ELF文件提供了两种视图来反映这两种情况:链接视图执行视图。...数据段(.data)只读数据段(.rodata) .data段保存是那些已经初始化了全局静态变量和局部静态变量。...符号表(.symtab) 在链接过程中需要把多个不同目标文件合并在一起,不同目标文件相互之间会引用变量函数。在链接过程中,我们将函数变量统称为符号,函数名变量名就是符号名。...每个定义符号都有一个相应,叫做符号(Symbol Value),对于变量函数,符号就是它们地址。 符号表是一个Elf32_Sym(32位)数组,每个Elf32_Sym对应一个符号。...Elf32_Dyn结构由一个类型加上一个附加数值或指针,对于不同类型,后面附加数值或者指针有着不同含义。 ?

3.7K81

C语言(2)----数据类型、变量以及操作符

可见,数据类型包含内置类型自定义类型,而前者是官方提供几种可使用类型,而后者则是可以用来给编写者创造出自己所要数据类型基本模板。 首先介绍内置类型。...这样不利于程序可移植性。 C 语⾔提供了⼀个解决⽅法,创造了⼀个类型别名 size_t ,⽤来统⼀表⽰ sizeof 返 回类型。...C语⾔中把经常变化称为变量,不变称为常量。 从第一点我们可知数据类型是用来描述生活中各种数据。而不同数据类型也要对应实际生活不同事物。 例如,年龄是整数,故用int。...• 局部变量:在⼤括号内部定义变量就是局部变量 局部变量使⽤范围是⽐较局限,只能在⾃⼰所在局部范围内使⽤。 在大括号内定义变量,即局部变量是无法被全局变量识别的。...可以把全局变量想象成共享单车,而局部变量就是自己家上锁自行车,当全局变量和局部变量冲突时候,即名字重复时候,会优先识别局部变量,就好比当你家自行车共享单车款式相同,你当然更喜欢能上锁自己家那一辆

7810

地址无关码

这里我们把共享对象模块中地址引用按照是否跨模块分成两类:模块内部引用模块外部引用;按照不同引用方式又可以分为指令引用和数据访问,这样我们就得到了如图7-4中4种情况。...-fpic-fPIC 使用GCC产生地址无关代码很简单,我们只需要使用“-fPIC”参数即可。...实际上GCC还提供了另外一个类似的参数叫做“-fpic”,即“-fPIC”3个字母小写,这两个参数从功能上来讲完全一样,都是指示GCC产生地址无关代码。...原因是,由于地址无关代码都是跟硬件平台相关,不同平台有着不同实现,“fic”在某些平台上会有一些限制,比如全局符号数量或者代码长度等,而"-fPIC”则没有这样限制。...Q&A Q:如果一个共享对象 lib.so中定义了一个全局变量G,而进程A进程B都使用了lib.so,那么当进程A改变这个全局变量G时,进程B中G会受到影响吗? A:不会。

95820

C++中Const常量机制分析

,var使用也变化,最新。...其对应Ndx下标14,表明该变量存储在msgq文件中下标14段。 执行命令 readelf -S msgq 可见,对变量地址进行修改后,var使用也变化,最新。...如:全局变量,静态局部数据变量,全局静态变量。 4,对于内置类型自定义类型数据,const实现原理一样吗? 4.1局部变量 内置类型自定义类型完全一样,都没有分配存储空间。...并把cpp对应生成.o文件链接可执行程序。 可以正常编译链接,不会报错。 会对该const变量分配空间,且被重复存储在不同只读数据段。重复次数引用该.h文件cpp生成.o文件个数一致。...查看符号表。 可以看到存在两个var符号,地址不同。 运行结果 各cpp文件读取对应只读数据段数据,互不影响。

2.3K151

一文领略链接与装载

符号表是一个结构体数组,每一个元素记录了某个符号符号名(在字符串表中下标)、符号符号类型(段还是函数或变量)、符号绑定信息(局部还是全局、弱符号还是强符号)、符号所在段(在段表中下标)、符号大小...这里需要注意符号: 对段来说,符号是该段起始地址,这是编译器生成便于后面快速查询段。 对函数变量来说,符号是它们地址。...弱符号与强符号 符号分为弱符号与强符号,对于 C/C++ 来说,编译器默认函数已初始化全局变量符号,未初始化全局变量符号,可以使用__attribute__ ((weak))定义一个弱符号...BSS 段 BSS 段存放是的未初始化局部静态变量,不同编译器实现可能有差异,所以主要是理解思想。...应该很容易想到,未初始化局部静态变量之所以不占用磁盘是因为它们默认都为 0,既然都是 0 就没必要专门拿磁盘空间来存它们

88630
领券