assembly
文章平均质量分 85
zhouguoqionghai
这个作者很懒,什么都没留下…
展开
-
C++ 中 new, delete 形式必须匹配的原理
C++当中,new 和delete必须匹配的原理探究不考虑面向对象的情况下,C++ 当中的 struct与 C 语言的 struct 的一个大不同就是C++当中存在构造函数和析构函数。对象创建时,要调用构造函数;对象离开作用域,会调用析构函数。c++ 中 new的几种形式C++中的 new有 3 种形式,常见的用来在堆上构建对象的那个 new,还有 operator new 和 placement new. operator new 可以重载,其实 placement new 就是operato原创 2022-01-15 14:12:48 · 573 阅读 · 0 评论 -
x64 可变参数原理完全解析
问题引子stackoverflow 上有这个问题,标准里说makecontext的可变参数都必须是int类型,然后发现 makecontext 的源码里有如下一段注释说明。 /* Handle arguments. The standard says the parameters must all be int values. This is an historic accident and would be done differently today. F...原创 2021-12-31 15:41:23 · 1498 阅读 · 1 评论 -
调用栈被破坏的手动恢复
函数调用前言后序一般来说,在未优化的情况下,函数的调用栈的前言和后续对应的指令都是固定的。push %rbpmov %rsp,%rbpsub $10,%rsp #这里的立即数 10 表示函数需要的栈大小,与函数自身小关leave # leave 等价于以下两条指令#mov %rbp,%rsp#pop %rbpretpush %rbp 之后,栈顶指针rsp 便指向rbp; mov %rsp,%rbp 之后,rbp 也指向栈顶,所以在 callee 被调用函数的栈当中,rbp指原创 2021-11-26 15:26:25 · 1241 阅读 · 0 评论 -
LD_PRELOAD,patchelf 与 hook
之前一篇文章说明过 elf 当中的符号决议顺序,最先被解析的符号先入为主,作为最终被使用的符号,本篇的用到的代码同之前的一篇相同。LD_PRELOAD LD_PRELOAD 的原理就是在先于所有依赖的动态库,提前加载 LD_PRELOAD 环境变量当中指定的库。main.out 依赖外部动态库 libmyprintf.so 的 myprintf 函数,依赖的动态库在编译时,被写入到可执行文件当中,可以使用readelf -d来查看。加入此时另外有个动态库 libmsgpri..原创 2021-11-23 12:27:30 · 571 阅读 · 0 评论 -
elf 符号决议 处理详情
通过源码文本文件得到 elf 二进制文件,包含预处理,编译成汇编文件,汇编成目标文件,链接这几个过程。链接有编译时链接,加载时链接(动态链接库),运行时链接(dlopen的那一套)。动态库当中定义的全局符号无论是变量还是函数,都是间接访问,即使是定义在同一个源文件当中。访问本动态库中的全局变量,一样的使用 .got; 调用本动态库当中的函数,一样的使用 plt 技术。myprintf.s 文件.section .data.type age,@object.global age原创 2021-11-23 11:25:04 · 500 阅读 · 0 评论