编译与链接
文章平均质量分 68
sydyh43
这个作者很懒,什么都没留下…
展开
-
makefile的一些小疑问
避免出现clean的文件在当前目录下,执行makefile报错。当然一般也不太可能存在clean文件,一般clean标志默认就是使用清文件的标志。出现错误退出,继续往下运行。告知系统hello是一个伪目标,当目标文件已经存在目录下时,不需要处理,直接执行下面的脚本。可以看出,顶格写的hello是需要生成的目标文件。答案是,没有执行成功,会报错。如make-frule.debug,rule.debug就是makefile文件。1、makefile中有.PHONY修饰clean,为什么需要.PHONY?...原创 2022-06-03 09:59:33 · 170 阅读 · 0 评论 -
strip后发布的程序如何gdb调试
1、针对于对存储空间敏感的设备,比方说嵌入式设备,本身存储空间非常有限,时常为了扣几个KB的空间而废寝忘食。因此对外发布应用程序时,都会通过strip命令把相应的debug信息删除,减少程序本身的大小。但是程序出问题时,由于缺少debug信息,很难完成问题的定位。strip strip_symstrip前后的程序对比,少了很多debug信息的section。(readelf -S strip_sym)strip前strip后,包含很多debug信息section被删除,相应的文件大原创 2022-02-25 13:37:48 · 1448 阅读 · 0 评论 -
内存飞踩问题的几点思考
1、程序编译,链接后生成二进制可执行程序。二进制可执行文件以elf格式实现排列。可以通过readelf -S xxxx查看具体section的划分,粗略划分如下图所示。在这些section中,代码段是只读的,自然也就不存在代码(指令)被改写的情况。数据段,堆,栈区具有读写的属性,但是数据段和堆一般存放的是数据,不涉及到指令的问题。剩下的栈区,存放的既有数据,又有代码(指令),可能存在代码(指令)被改写,即内存被飞踩现象。2、栈空间数据被修改情况2.1、先做个实验(ARM 32环境)原创 2021-09-15 20:32:15 · 2217 阅读 · 2 评论 -
用户态的内存泄漏定位,函数重载
1、函数重载的方法如何实现函数打桩_sydyh43的博客-CSDN博客2、具体实现代码工程中,申请和释放内存是通过malloc和free实现的。接下来的工作就是对malloc和free两个函数实现重载。在malloc重载函数中创建一个文件,文件名由malloc返回的地址命名,文件中保存调用malloc重载函数的地址。在free重载函数中删除以释放地址命名的文件。运行一段时间后,查看剩余的文件,剩余文件就是可能出现内存泄漏的地址,通过保存在文件中的数据确认调用malloc的地方。2.1、mal原创 2022-01-19 18:52:26 · 298 阅读 · 0 评论 -
如何实现函数打桩
1、打桩是干什么的?在对打桩函数本身执行完整的基础上,添加一些额外的代码,完成必要的信息采集,用于具体的问题定位。2、打桩的时机程序从诞生到生存分三个阶段,编译,链接和运行函数分别可以在这三个阶段实现打桩操作3、打桩的实现3.1、代码框架main.c函数调用libmalloc0.so动态库函数,libmalloc1.so调用libmalloc0.so动态库函数3.2、代码路径GitHub - dyh-git/func_stub: 函数打桩,重载函数3.3、具体情况3.原创 2022-01-19 18:51:24 · 2255 阅读 · 0 评论 -
动态库*.so的延时绑定分析
1、程序运行过程中需要调用动态库中的函数,因此必须先指定动态库的路径,否则会报无法找到动态库的错误。需要动态添加动态库路径export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dyh/project/test_space/malloc/output/libs2、程序运行过程中会调用动态库中的很多函数,这些函数的地址不是在运行的时候全部完成绑定,而是需要的时候才做绑定动作,俗称延时绑定(lazy binding)。效率最大化的表现。3、如何完成延时绑定原创 2022-01-19 18:50:26 · 586 阅读 · 0 评论 -
添加自定义的section
一、编译的程序(o so exe ko等等)都是elf格式进行排列的elf文件分析情况:https://blog.csdn.net/edonlii/article/details/8779075二、添加自己的section#define SECTION_START(_type,_name) \static const struct mydyh_desc __mydyh_desc_##_type \ __attribute__((used, __section__(".dyh.info.原创 2021-08-13 21:11:54 · 2949 阅读 · 5 评论 -
构建用户态下的内存泄漏
一、构建动态库的内存泄漏1.1、构建动态库调用动态库的内存泄漏#include <unistd.h>#include <stdio.h>#include <malloc.h>#include <string.h>void *mall_so_ano(void){ char *p = NULL; p = (char *)malloc(100); memset(p, 0x00, 100); printf("%s, %d\n", _原创 2021-08-07 15:18:18 · 304 阅读 · 0 评论 -
静态库的制作和问题
一、静态库特点静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件中取得所需的代码,复制到生成的可执行文件中的这种库。(百度百科)二、如何制作静态库1、先编译成*.o文件2、压缩成*.a静态库文件3、可以具体查看*.a文件包含哪些*.o文件4、静态库的使用其中-L指定静态库的存放位置三、抛出问题:1、使用nm 命令行查看main工具具体链接进来哪些函数。按上面静态库的定义,main程序只会链接使用到的原创 2020-09-16 22:18:04 · 165 阅读 · 0 评论 -
动态库的制作和使用
一、什么是动态库?动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个so文件中,该so包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。(百度百科)说白了,程序运行时就已经有可执行的代码函数是静态库链接;没有可执行的代码函数就是动态库链接。二、如何制作动态库1、先编译成*.o文件2、生成动态库3、编译可执行程序其中-L指定动态库的存放位置4、执行可执行程序无法成功!程序运行的时候会去动态库中找可执行的代原创 2020-09-13 22:08:18 · 1444 阅读 · 0 评论 -
问题定位——函数重载
打桩截获库函数的代码调用,执行自己的代码。功能追踪某函数的调用次数或者增加函数的某些定位功能(比如加入堆栈功能,查看此函数会被哪些函数调用)根据程序的编译步骤,可以通过以下三种方法实现打桩功能编译时本地定义一个*.h头文件,定义打桩函数,编译时指定头文件路径,优先搜索本地*.h文件链接时gcc支持—wrap f标志进行链接时打桩。这个标志告诉链接器,把对符号f的引用解析成__wrap_f,同时把对符号__real_f的引用解析成f其中-Wl,--wrap,ma..原创 2020-09-18 23:15:50 · 576 阅读 · 0 评论