学习
实践
活动
工具
TVP
写文章

认识目标文件结构

1.目标文件简介 目标文件是源代码编译但未链接的中间文件(Windows的.obj和Linux的.o),Windows的.obj采用 PE 格式,Linux 采用 ELF 格式,两种格式均是基于通用目标文件格式 首先将如下具有代表性又不会过于复杂的 C 源码通过 gcc 只编译不链接生成目标文件 test.o,然后对目标文件 test.o 进行分析。 比如目标文件B用到了目标文件A中的函数foo,那么称目标文件A定义了函数foo,目标文件B引用了函数foo。定义与引用这两个概念同样适用于变量。 每一个目标文件都会有一个相应的符号表(Symbol Table),这个表里记录了目标文件中所用到的所有符号。 这个符号表示该符号在本目标文件被引用到,但是定义在其他目标文件中 (3)符号值(st_value) 在目标文件中,每一个符号都有一个对应的值,不同类型的符号其值具有不同的意义。

62630

认识目标文件的符号

每一个目标文件都会有一个相应的符号表(Symbol Table),表里记录了目标文件用到的所有符号。 1. 比如汇编源代码包含了一个函数foo,那么汇编器编译成目标文件以后,foo在目标文件中对应的符号名也是foo。 多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误。 规则2:如果一个符号在某个目标文件中是强符号,在其他文件中都是弱符号,那么选择强符号。 规则3:如果一个符号在所有目标文件中都是弱符号,那么选择其中占用空间最大的一个。 比如目标文件A定义全局变量 global 为 int 型,占4个字节;目标文件B定义 global 为 double 型,占8个字节,那么目标文件 A 和 B 链接后,符号 global 占8个字节(尽量不要使用多个不同类型的弱符号

62040
  • 广告
    关闭

    年末·限时回馈

    热卖云产品年终特惠,2核2G轻量应用服务器6.58元/月起,更多上云必备产品助力您轻松上云

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    目标文件函数隐藏初探

    目标文件函数隐藏初探 场景如下,需要以.o形式(静态库形式),发布一个库,给其他代码集成。生成库mylib.o之后,使用nm查看,可以查看到很多函数符号。 但这么修改之后,库本身的其他源文件,也无法使用该函数了,因为c语言中的static是将函数的作用域限定在了函数所在的源文件。 printf("inner 2\n"); } void api_1() { printf("api 1\n"); } void api_2() { printf("api 2\n"); }; 编译生产目标文件 main.c:(.text+0x28):对‘inner_fun2’未定义的引用 collect2: error: ld returned 1 exit status 使用objcopy的效果 不修改源文件 但即使strip删除了符号表,也还是可以从二进制文件中分析到内外部函数名称的。所以如果想隐藏内部函数名称,以避免暴露内部逻辑,那就还需要使用一些其他的手段。

    39110

    目标检测王者库MMDetection迎来重大版本更新

    如果要给目前的目标检测开源库排名的,那由商汤科技和香港中文大学开源的MMDetection库一定是最强的王者,这个开源库基于PyTorch,支持很多主流的目标检测模型,而且在不断更新。 近期,MMDetection库迎来了V2.0版本的重大更新: ? 这个版本的更新属于重量级的,体现在各个方面: 更快的速度:无论是训练速度和推理速度都有大幅度的提升(30%和25%),目前训练速度已经和detectron2不相上下 ? 支持PyTorch 1.5 配置文件优化:支持继承减少了大量冗余; 更好的模块化设计:凸显灵活性和易用性; V2.0 的模块化设计比1.x更加细粒度,灵活性更强, 从单纯的目标检测框架向检测类任务的框架平台转变 当然,更重要的是支持更多的模型,目前MMDetection已经支持持了35篇论文中的算法,提供了超过250 个预训练模型,是目标检测领域最大规模的模型库(这也是mmdet的最强的地方)。

    58120

    Python 监测文件是否更新

    主要逻辑是判断文件的最后修改时间与创建时间是否在秒级别上一致,此代码适用于Python 2.x;Python 3.x需要改一下代码。

    86010

    电脑对于目标文件系统过大_提示文件过大

    Win10系统提示对于目标文件系统过大 今天在复制MAC系统文件时,系统弹出窗口提示“对于目标文件系统,文件XXX过大”。 出现这种情况的原因是FAT32的文件系统不支持复制大于4g的单个文件,而NTFS则是支持大文件,所以我们可通过转换文件格式来解决问题,下面是Win10系统提示对于目标文件系统文件过大的具体解决步骤。 5、我们再试试复制刚才那个文件进去试试是否能够复制大于4g的文件,结果是可以的!看看文件系统,已经变成NTFS了。 以上就是Win10系统提示对于目标文件系统文件过大解决教程,按上述步骤操作即可解决问题。

    15730

    目标代码文件,可执行文件和库

    C编程的基本策略就是使用程序将源代码文件转换为可执行文件,此文件包含可以运行的机器语言代码。 C语言分两步来完成这个工作。 编译 链接 编译器将源代码转换为中间代码 链接器将此中间代码与其他代码相结合来生成可执行文件。 这样做可以使程序更加模块化,各个模块可以分别编译。然后再使用链接器把编译过的模板结合起来。 中间文件的形式有多种选择,我们一般选择将源代码转换为机器语言代码,然后将转换的结果放入到一个目标文件中(目标代码文件)。虽然这个目标文件中包含了机器语言代码,但是不是一个完整的程序,暂时不能运行。 库代码,即是C语言的库函数代码,几乎每一个函数都会用到库函数文件。 所以链接器就是把启动代码,库代码,和目标代码结合在一起,并将它们放入单个文件,即可执行文件。 简而言之,目标文件和可执行文件都是由机器语言指令组成的,但目标文件只包含你所写的代码所转换的机器语言,而可执行语言还包含所使用的库函数以及启动代码的机器代码。

    20410

    屏蔽自动更新描述文件(屏蔽描述文件)

    关于iOS屏蔽系统升级的描述文件在几个月前失效的事情大家都清楚了,苹果先是让描述文件失效,然后重新分享的屏蔽升级描述文件也相继的失效,之后也没有新的文件出来。 有些方法还不能够完全解决问题,进行了屏蔽之后可能会让App Store不能够进行正常的软件更新。 许多人的现在使用的系统基本上都在这个版本以上,所以安装无效或者无法安装使用的问题也存在 image.png 其实每年快到新的系统更新的时候,新的描述文件就会出来,但是估计现在很多人也是在iOS 13系统 好消息是,今天新的屏蔽升级描述文件tvOS 13屏蔽系统升级描述文件出来了,适用于iOS 13+系统的屏蔽升级,如果你不确定你的是否能够屏蔽,可以安装试试,然后尝试检查系统更新。 image.png 安装完成之后的确认——到【软件更新】中进行检测,就会看到现有系统版本提示最新版本(现在iOS最新版本为iOS 13.5.1)。

    36610

    Makefile 文件格式;makefile伪目标

    Makefile包含 目标文件、依赖文件、可运行命令三部分。  每部分的基本格式例如以下: test: prog.o  code.o          gcc  -o  test   prog.o   code.o 当中,第一行的test是目标文件。 prog.o、code.o是依赖文件;            第二行的gcc -o test prog.o code.o是可运行命令。 整个Makefile文件都是这样的格式。 参考链接: https://blog.csdn.net/haoel/article/details/2886 Makefile 伪目标: https://www.cnblogs.com/hnrainll

    22420

    Linux文件操作技巧(持续更新)

    1.删除当前目录下指定后缀的文件,比如.xml文件,注意一定要加*号find . -name "*.xml" -exec rm -rf {} \;2.删除某一个目录rm -rf Annotations3.批量创建文件mkdir Annotations{1..5}4.复制文件目录cp -ri ~/Desktop/1_paper/2_Augumentation_NWPU/JPEGImages ~/Desktop/1_paper/4_cross_validation5.统计当前目录下文件的个数 ls -l |grep "^-"|wc -l6.批量复制文件cp /home/usr/dir/{file1,file2,file3,file4} /home/usr/destination/

    31730

    pycharm 如何更新本地项目文件

    本地更新项目文件后,pycharm不会自动更新导航栏的文件目录,运行程序时报错,找不到文件: 解决办法1: 解决办法2: 如果不管用,记得重启软件。

    9320

    【持续更新】nginx 文件配置解析

    端口重定向至https          autoindex on; #自动显示目录 默认为off                 autoindex_exact_size off; #人性化方式显示文件大小否则以   /50x.html;         location = /50x.html {             root   html;         }                  #php文件配置 ssl_certificate_key /usr/local/nginx/html_register/ssl/2.key;         client_max_body_size     50m; #文件大小限制

    9510

    ios屏蔽ota更新描述文件(苹果软件更新怎么关闭)

    前言 iOS手机下载新系统文件后,老是提示更新升级,确实很烦人,且为了防止手机被不小心给升级了,可以按照以下方法让手机显示当前版本为最高版本,不会下载升级包进行安装升级。 操作步骤 1、Safari浏览器中输入网址 ibeta.me 进入网页,选择最右侧 屏蔽 OTA 更新,点击 立即安装 则会立即下载一个描述文件。 2、进入手机 设置-> 通用->描述文件 选择 tvOS 13 BetaSoftware Profile,点击 安装 3、安装成功后,会提示重启手机,点击重启 4、重启手机后,到 设置- > 通用->软件更新 中查看,显示 您的软件是最新版本,再不会下载系统自动更新啦! 如果想继续让系统更新,移除 tvOS 13 BetaSoftware Profile这个文件即可。 不止iOS13系统可以下载这个文件阻止系统更新,iOS其他系统也适用,且实际验证过确实可以。

    2.5K40

    苹果屏蔽更新描述文件_屏蔽iPhone更新的iOS描述文件安装办法「建议收藏」

    屏蔽iOS更新分两种,第一种非越狱设备,只能系统在12.1以下的才能安装屏蔽描述文件 safari浏览器输入ibeta.me回车,找到下图的屏蔽OTA更新,直接安装就行了 第二种越狱设备,首先添加源 https://xsf1re.github.io/repo/安装下图这个插件 这个文件可以解除12.1以上设备描述文件失效不允许安装的问题,作者说写着兼容12.4-13.3,其他系统的老铁们自己测试下能不能用 ,安装好之后到ibeta.me安装屏蔽OTA更新,就搞定了 还是原来的图标,还是那熟悉的味道,久违了,为了防止无孔不入的iOS更新,再添加这个源http://cydia.ichitaso.com/安装下图插件屏蔽更新 预防工作要做好,刻不容缓,还有一些细节要注意,一,设置说-通用-软件更新-自动更新(关闭) 二,设置-通用-存储空间(删除要更新的固件) 三,睡觉前,充着电,开着WIFI的小伙伴要注意,关闭联网 ,不然等你睡醒就JJ了(自动升级) 四,当你的手机要求输入密码的时候要看清楚在输,很可能是系统更新的确定,输了也不要慌,一二三步做好了,问题不大 发布者:全栈程序员栈长,转载请注明出处:https:/

    2.4K20

    基于Nginx 的中间件架构(更新 ing)目标安排

    目标 一:教你实战 ? ? 二:了解中间件架构 ? image.png ? Nginx 性能优化 ? 三:贯彻技术原理 ? 四:理论结合实践 安排 ? 基础篇 ? 场景实践篇 ?

    62960

    SpringBoot 动态更新 resources 目录的文件

    一、前言  SpringBoot 打成 Jar 包形式运行后 ,resources 目录下文件的读取修改和原来不太一样,网上比较多的是关于读取的方式,修改的几乎没有,终于在 stackoverflow set.add(txt); } } catch (Exception e) { log.error("sensitiveWords.dat 文件不存在

    2.3K00

    Android更新资源文件浅思考

    前言 最近在看 《深入探索Android热修复技术原理7.3Q.pdf》 时,遇到一个之前没有注意过的问题:关于资源修更新的Android的版本兼容? 作为程序员我们需要非常严谨的思路,是什么导致了资源的修复更新需要做版本兼容? 这个问题是使我写下这边文章的原因,下边我们带着问题来找答案!!~! 这个问题的解释网上答案比较少,在滴滴的插件化框架相关文章 VirtualAPK 资源篇 和 阿里云移动热修复(Sophix) 相关文章 Android热修复升级探索——资源更新之新思路 中 都有一句概括性质的话语

    65720

    python解析xml文件(解析、更新、写入)

    Overview 这篇博客内容将包括对XML文件的解析、追加新元素后写入到XML,以及更新原XML文件中某结点的值。 写入XML文件 在写入时,我觉得可分为两种方式: 新建一个全新的XML文件 在已有XML文件基础上追加一些元素信息 至于以上两种情况,其实创建元素结点的方法类似,你必须要做的都是先创建/得到一个DOM对象 如果是第一种情况,你可以通过dom=minidom.Document()来创建;如果是第二种情况,直接可以通过解析已有XML文件来得到dom对象,例如dom = parse(". 更新XML文件更新XML时,只需先找到对应的元素结点,然后将其下的文本结点或属性取值更新即可,然后保存到文件,具体我就不多说了,代码中我将思路都注释清楚了,如下: def updateXML(): 其实也就是name的兄弟节点 # 可能有sibNode方法,我没试过,大家可以google一下 phone = pn.getElementsByTagName("phone")[0] # 更新

    21610

    使用ld命令链接目标文件生成可执行文件

    使用ld链接目标文件生成可执行文件,用于取代命令g++,仅仅用于学习ld命令的使用,不用于实际的项目编译。 首先看一个简单的C++源文件main.cpp。 <iostream> using namespace std; int main() { cout<<"hello world"<<endl; } 当我使用命令g++ -c将其编译为目标文件 /lib64/crtn.o main.o 所以,使用上面的命令选项作用于ld命令,即可完成目标文件的链接。

    3.4K30

    SVN提示update更新成功,但是本地文件却没有更新

    问题描述:将仓库的最新版本代码check out到本地后,然后最某个文件做了修改,保存后想通过svn的update来重新得到最新的版本,发现失效。 _ea=1309263 https://www.jianshu.com/p/62d640a2e6b9 猜测主要原因是: 最新版本的修改记录中没有你当前所修改的文件。 每次更新的时候,只会更新作出修改的那些文件 解决办法: 如果你是在最新的版本上作出的修改,不要用update更新,而是用revert回退到当前的版本(既然当前的版本的版本是最新版本,那么回退到当前的版本可以还原到最新的版本

    40910

    扫码关注腾讯云开发者

    领取腾讯云代金券