摘要: 为了查看linux下malloc的实现函数,下载了Glibc的源码文件,可是找不到实现的函数在哪里。看文件名 应该是在malloc/malloc.c里面。发现__libc_malloc的实现比较像。怎么从malloc到__libc_malloc的呢?看到文件里有一个语句有点苗头来看看strong_alias的实现_typeof (name) aliasname 就是定义别名的意思了 至于后面的__attribute__看下面的解释。GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量 阅读全文
posted @ 2013-03-12 20:54 JustinYo 阅读(5528) 评论(0) 推荐(0) 编辑
摘要: 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; PCHAR pa, pb; 用途二: 用在旧的C代码中,帮助struct。以前的代码中,声明struct新对象时,必... 阅读全文
posted @ 2013-03-12 19:38 JustinYo 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 1.首先我们看第一个例子: [cpp] view plaincopy #include <iostream>using namespace std; typedef char byte; int main() { byte *buffer = new byte[1000]; int *pi = new(buffer)int[10]; pi[0] = 3; cout<<(int)*... 阅读全文
posted @ 2013-03-11 20:35 JustinYo 阅读(429) 评论(0) 推荐(0) 编辑
摘要: 单个class的new的重载重载的 new、delete(或者 new[]、delete[])操作符必须是类的静态成员函数(为什么必须是静态成员函数,这很好理解,因为 new 操作符被调用的时候,对象还未构建)或者是全局函数,函数的原型如下:void* operator new(size_t size) throw(std::bad_alloc);// 这里的 size 为分配的内存的总大小void* operator new[](size_t size) throw(std::bad_alloc);void operator delete(void* p) throw();void oper 阅读全文
posted @ 2013-03-11 20:05 JustinYo 阅读(3338) 评论(0) 推荐(0) 编辑
摘要: 逆向调试不是逆向执行,而是模拟逆向执行。在打开逆向调试开关后,程序的执行会记录下程序运行的详细状态轨迹(想象一下把图灵机运行时的每一步纸带 的状态记录下来)。这些状态就构成了逆向调试的基础。 逆向调试的预期用处是,因为程序bug的发生处和表现处一般会有距离,那么在程序bug表现处回溯执行,就可以确定地找到bug的真正原因。这可是 很有用的哦,因为这可以避免多次运行程序,有时还徒劳武无功,尤其是在... 阅读全文
posted @ 2013-03-11 19:31 JustinYo 阅读(1363) 评论(0) 推荐(0) 编辑
摘要: C++平台有四种方式动态索求和释放内存 new和delete编译器帮你做的事情 实际上new申请的空间是由全局new ---->::operator new(size) 阅读全文
posted @ 2013-03-11 17:15 JustinYo 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 在Windows下,查看环境变量的命令是:set,这个命令会输出系统当前的环境变量。Linux下准确的说是RedHat下应该如何查看呢,命令是:export如果你想查看某一个名称的环境变量,命令是:echo $环境变量名,比如:echo $Oracle_HOMEWindows对应的命令是:set 环境变量名。 阅读全文
posted @ 2013-03-11 16:18 JustinYo 阅读(485) 评论(0) 推荐(0) 编辑
摘要: gdb调试的时候突然就遇到一个问题l xxx.cpp:512 没有问题但是b xxx.cpp:512的时候就会出现Cannot access memory at address 0xxxxx的问题原因是什么? 阅读全文
posted @ 2013-03-11 15:20 JustinYo 阅读(7576) 评论(1) 推荐(0) 编辑
摘要: C++中虚函数与晚绑定的编译器实现编译器到底做了什么实现的虚函数的晚绑定呢?我们来探个究竟。编译器对每个包含虚函数的类创建一个表(称为V TA B L E)。在V TA B L E中,编译器放置特定类的虚函数地址。在每个带有虚函数 的类中,编译器秘密地置一指针,称为v p o i n t e r(缩写为V P T R),指向这个对象的V TA B L E。通过基类指针做虚函 数调用时(也就是做多态调用时),编译器静态地插入取得这个V P T R,并在V TA B L E表中查找函数地址的代码,这样就能调用正确的函数使 晚捆绑发生。为每个类设置V TA B L E、初始化V P T R、为虚函数 阅读全文
posted @ 2013-03-11 13:27 JustinYo 阅读(893) 评论(0) 推荐(0) 编辑
摘要: ELF文件有三种类型:可重定位文件:也就是通常称的目标文件,后缀为.o。共享文件:也就是通常称的库文件,后缀为.so。可执行文件:本文主要讨论的文件格式,总的来说,可执行文件的格式与上述两种文件的格式之间的区别主要在于观察的角度不同:一种称为连接视图(Linking View),一种称为执行视图(Execution View)。elf文件的格式可以通过readelf命令读取出来-a --all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I. -h --file-header 显示elf文件开始的文件头信息. -l --program-headers --segme 阅读全文
posted @ 2013-03-08 21:07 JustinYo 阅读(616) 评论(0) 推荐(0) 编辑