首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么静态链接的可执行文件中存在全局偏移表和过程链接表?

为什么静态链接的可执行文件中存在全局偏移表和过程链接表?
EN

Stack Overflow用户
提问于 2016-01-18 00:19:24
回答 2查看 965关注 0票数 5

我已经阅读了大量关于动态链接器重新定位和位置独立代码的文章,包括过程链接表和全局偏移表。我不明白为什么静态链接的可执行文件需要PLT和GOT。我在我的ubuntu x86_64机器上编译了一个hello程序,当我用readelf -S转储节头时,它会显示PLT和GOT节。

我还创建了一个共享库,其中包含一个简单的增量函数,我在没有gcc -shared的情况下编译了这个库,我还看到了PLT和GOT部分。我也没想到会这样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-18 11:59:54

我不明白为什么静态链接的可执行文件需要PLT和GOT。

事实并非如此。

我在我的ubuntu x86_64机器上编译了hello程序,当我用readelf转储节头时,它会显示PLT和GOT节。

这是一个执行上的意外。这些部分来自crt1.o,并且没有一个用于完全静态链接的单独的crt1s.o,因此您将从那里得到.plt.got条目。

您可以剥离这些部分,二进制文件仍然可以工作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
objcopy -R.got -R.plt a.out a.out2

注意:不要剥夺.rela.plt,因为该部分仍然需要实现IFUNC的。

票数 5
EN

Stack Overflow用户

发布于 2022-04-01 04:31:41

我发现gcc在生成位置独立的代码并接受另一个源文件中定义的函数的地址时,会生成一个.got.got.lpt

我的测试文件是:

第1.c部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extern void afunc();

int _start()
{
  return 0x55 & (__SIZE_TYPE__) afunc;
}

第2.c部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void afunc() {}

我的考试是(代替你自己的gcc版本):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for o in s 4 3 2 1 0
do
  aarch64-linux-gnu-gcc-10 -fPIC part1.c part2.c -o static.elf -static -nostdlib -O$o &&
  aarch64-linux-gnu-objdump -x static.elf | grep 'GLOBAL_OFFSET'
done

对于所有优化级别,我得到以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0000000000410fd8 l     O .got   0000000000000000 _GLOBAL_OFFSET_TABLE_

-fPIC代替-fno-PIC,段就会消失。

通过运行以下命令,可以判断编译器是否默认为-fPIC

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aarch64-linux-gnu-gcc-10 -mcmodel=large -x c - < /dev/null 

由此,我得到了错误,如果是这样的话:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cc1: sorry, unimplemented: code model ‘large’ with-fPIC’
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34850007

复制
相关文章
[数据结构与算法] 链接表总结
上一次说到了顺序表,链接表和顺序表一样,也是线性表。那为什么有了线性表还要有链接表呢?总之就是当数据过大时,顺序表存在一些存储方面的限制,而链接表比顺序表要更有效。链接表的主要不同之处在于使用了链接技
用户1622570
2018/04/12
9240
[数据结构与算法] 链接表总结
Data Vault初探(八) —— 定期装载_Kettle_链接表
装载链接表作业: 装载订单客户链接表: 装载订单产品链接表: 装载产品-产品分类链接表:
用户1148526
2022/05/07
2310
Data Vault初探(八) —— 定期装载_Kettle_链接表
为何百兆静态库能打进数兆的可执行文件?
前言 第三方库是工程开发必不可少的部分,而第三方库可以是.a和.framework的静态库,也可以是.framework的动态库,其中静态库是最常用的方式。 静态库往往比较大,可在打包到可执行文件之后,对安装包大小的增加远远小于静态库本身的Size。 那么,就产生两个问题: 1、静态库里面存在什么内容? 2、静态链接到可执行文件后为什么体积变小? 本文就以.framework的静态库来分析具体情况。 正文 1、framework静态库的打包 新建工程,选择Cocoa Touch Framework
落影
2018/04/27
2.5K1
为何百兆静态库能打进数兆的可执行文件?
深度解密Android中基于plt/got的hook实现原理
我们日常开发中编写的C/C++代码经过NDK进行编译和链接之后,生成的动态链接库或可执行文件都是ELF格式的,它也是Linux的主要可执行文件格式。我们今天就要借助一个示例来理解一下android平台下native层hook的操作和原理,不过在这之前,我们还是要先了解一下ELF相关的内容。
open
2020/03/19
3.6K0
深度解密Android中基于plt/got的hook实现原理
WordPress 技巧:去掉评论模块中的网站链接表单
在 WordPress 的评论模块中,有填写网站地址或者链接的表单,有时候我们想去掉它,因为有很多人来发垃圾评论,目的就是用用户名做关键词,填写一个链接,吸引浏览者去点击它。
Denis
2023/04/15
6160
【胖虎的逆向之路】——GOT/PLT Hook详解&针对自定义so库的Hook实操
随着 Android 开发的技术宽度不断向 native 层扩展,Native hook 已经被用于越来越多的业务场景中,之前作者一直游离于Java层面的逆向,后来工作使然,接触到了Native 层的Hook,熟悉了ELF的文件结构&GOT/PLT&In Line Hook的相关知识和实际操作,Android Native Hook 的实现方式有很多种,我们接下来要讲的是 GOT/PLT Hook (篇幅略略略长,阅读时长约 20 min )
胖虎哥
2023/07/09
1.2K0
【胖虎的逆向之路】——GOT/PLT Hook详解&针对自定义so库的Hook实操
java静态全局变量和全局变量的区别_java静态全局变量
Java的面向对象的代码结构会使在多个位置引用变量更加困难。有时也很难确定给定变量应属于哪个类,尤其是当它是一个广泛使用的值(例如数据库连接器或数学常数)时。
全栈程序员站长
2022/09/24
4.5K0
java静态全局变量和全局变量的区别_java静态全局变量
学PWN 栈溢出
程序运行时,内存一段连续的区域,用来保存函数运行时的状态信息,包括函数参数和局部变量
用户5878089
2019/07/25
1.1K0
一文领略链接与装载
链接与装载是一个比较晦涩的话题,大家往往容易陷入复杂的细节中而难以看清问题的本来面目。从本质上讲各个系统的编译、链接、装载过程都是大同小异的,或许可以用一种更抽象的形式来理解这些过程,梳理清楚宏观的来龙去脉有利于对特定系统进行深入学习。
波儿菜
2019/12/13
9901
一文领略链接与装载
静态链接,静态分派,动态链接
首先明确一个点:静态类型和实际类型都是可以改变的。唯一不同的是静态类型的变化是通过强转实现的而java中又有对应的强转字节码来获取更改之后得变量的静态类型所以编译时是可以确定变量的静态类型的,但是实际类型需要根据运行时才能够进行确定(下面动态链接详细说明)。
北洋
2022/05/06
1.3K0
android sqlite 判断表和表中字段是否存在方法
/** *检查某表是否存在 * @param tableName 表名 * @return true:存在 false:不存在 */ public boolean tabIsExist(String tabName){ boolean result = false; if(tabName == null){ return false; } Cursor cursor = n
再见孙悟空_
2023/02/10
1.8K0
静态函数和全局函数
全局函数不同文件下,也可以调用,通过extern关键字声明后 静态函数只能在当前文件下使用
大忽悠爱学习
2021/03/02
1K0
静态函数和全局函数
ELF中可以被修改又不影响执行的区域
看雪上这篇文章讲述了两种对so进行加固的方法:1. 分离section,对整个section进行加密。2.在.text section直接寻找目标函数并进行加密,两种方式的实践代码见文末。 这里讲一些我在学习过程中的一些额外发现,如有理解不对的地方,欢迎斧正。 一. 关于ELF的链接视图和装载视图(执行视图)。在所有介绍ELF文件格式的文档中,都会出现这样一张图:
用户2930595
2018/08/23
2.3K0
ELF中可以被修改又不影响执行的区域
链接 动态链接 静态链接
要想了解底层,链接是一个不得不过的一关,我总结了下学习的心得,首先要了解链接器到底是如何工作的,链接器分为两类,一个是静态链接,一个是动态链接,先来讲解静态链接,静态链接要干两件事:
gzq大数据
2021/09/26
2.9K0
【图片+代码】:GCC 链接过程中的【重定位】过程分析
最近因为项目上的需要,利用动态链接库来实现一个插件系统,顺便就复习了一下关于Linux中一些编译、链接相关的内容。
IOT物联网小镇
2022/04/06
8140
【图片+代码】:GCC 链接过程中的【重定位】过程分析
CSAPP---第七章-链接
链接是将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存中执行。
大忽悠爱学习
2023/03/30
9250
CSAPP---第七章-链接
静态链接库和动态链接库的区别
Linux下得库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。面对比一下两者:
狼啸风云
2019/11/03
8.4K0
C++ 不知图系列之基于链接表的无向图最短路径搜索
邻接炬阵的优点和缺点都很明显。优点是简单、易理解,对于大部分图结构而言,都是稀疏的,使用矩阵存储空间浪费就较大。
一枚大果壳
2022/12/20
1.3K0
C++ 不知图系列之基于链接表的无向图最短路径搜索
cmake:动态链接库(so)中静态链接tcmalloc(gperftools2.4)暨静态链接libstdc++
将tcmalloc作为动态库使用,非常方便,网上有很多资料介绍了。tcmalloc.a也可以以静态链接的方式加入应用程序中,大概因为使用太方便,网上关于这方面的介绍都是一笔带过,但是如果要在动态 库(so)中静态编译tcmalloc,却是有所不同的。 我的项目中有一个so动态库,需要在java中通过jni调用,因为涉及频繁的内存分配操作所以这个so希望用tcmalloc管理内存池以提高系统运行效率,如果使用以动态库方式使用tcmalloc。那么在应用服务器(tomcat)启动的时候,需要先设置LD_PRELOAD参数指向tcmalloc.so,然后执行startup.sh启动tomcat。这样以来,不仅是我的so库,整java程序在运行过程中的所有向操作系统申请释放内存的过程都交给了tcmalloc管理了,其实挺好的。使用这种方案,我的so库代码不需要在编译时链接tcmalloc,什么都不用改变,就能使用tcmalloc。 但是凡事有利就有弊,这个方案带的成本就是在系统安装、维护时稍显复杂:需要在服务器上安装tcmalloc和libunwind(应用系统运行在64位操作系统下),还可能需要修改tomcat启动脚本以加入LD_PRELOAD参数,对工程实施人员的要求比较高。
10km
2022/05/07
2.1K0
got表和plt表在程序执行过程中的作用
这是前面文章中的演示程序,这个指令为在Add函数里面调用的printf函数,那么为什么printf后面会跟着 plt呢?
Elapse
2020/08/17
5.1K0

相似问题

是否可以以编程方式更改全局偏移表/GOT或过程链接表/PLT?

38

过程链接表和调用关系表

11

用于链接表中行的存储过程

10

防止GDB中的PLT (过程链接表)断点

46

EF和链接表

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文