随笔分类 - 链接、装载和库
深入了解一个程序含有什么,才能榨取性能
摘要:使用工具c++filt 命令示例: c++filt _Znwj 或者使用objdump objdump -C _Znwj
阅读全文
摘要:对于小于64字节的空间申请是采用类似于对象池的方法;对于大于512字节的空间申请采用的是最佳适配算法;对于大于64字节而小于512字节的,它会根据情况采取上述办法中的最佳折中策略;对于大于128KB的申请,它会使用mmap机制直接向操作系统申请空间。 空闲链表(最佳适配算法) 将堆中各个空闲的块按照
阅读全文
摘要:如果多个程序使用同一个动态库,动态库指令上面的跳转就会出现问题。所以我们需要把需要跳转的指令单独拿出来,跟数据部分放在一起,这样指令部分就可以保持不变,而数据部分可以在每个进程中拥有一个副本。这种方案就是目前被称为地址无关代码(PIC,Position-independent Code)的技术。 在
阅读全文
摘要:Linux中有一套规则来命名系统中的每一个共享库,它规定共享库的命名规则必须如下libname.so.x.y.z 最前面使用前缀“lib”、中间是库的名字和后缀“.so”, 最后面跟着的是三个数字组成的版本号。“x”表示主版本号,“y”表示次版本号,“z”表示发布版本号。 发布版本号表示库的一些错误
阅读全文
摘要:在动态库链接器中,dlopen()用来打开一个动态库,并将其加载到进程的地址空间,完成初始化过程,它的C原型函数位 void * dlopen(const char * filename, int flag); 第一个参数是被加载动态库的路径,如果这个路径是绝对路径,则该函数将会尝试直接打开该动态库
阅读全文
摘要:在进入execve()系统调用之后,Linux内核就开始进行真正的装配工作。在内核中,execve()系统调用相应的入口是sys_execve()。sys_execve()进行一些参数的检查复制之后,调用do_execve()。do_execve()会首先查找被执行的文件,如果找到文件,则读取文件的
阅读全文
摘要:举例 ENTRY(nomain) SECTIONS { . = 0x084800 + SIZEOF_HEADERS; tinytext : {*{.text} *{.data} *{.rodata}} /DISCARD/ : {*{.comment}} } 链接脚本由一系列语句组成,语句分俩种,一种
阅读全文
摘要:由上一篇博客知识可得,C++中对符号表中符号的生成方式是不一样的,所以我们需要一种兼容方式处理他们 上篇博客地址:https://www.cnblogs.com/woodx/p/17434227.html 但是如果我们需要C的静态库或动态库的时候,C++的符号表和C的符号表不是一样,是不是会发生冲突
阅读全文
摘要:函数签名:函数签名包含了一个函数的信息,包括函数名,它的参数类型,它所在的类和命名空间等其他信息 GCC的基本C++名称修饰方法:所有的符号都以“_Z”开头,对于嵌套的名字(在名称空间或在类里),后紧跟“N”,然后是各个名称空间和类的名字,每个名字前是名字字符串长度,再以“E”结尾,函数的参数紧跟在
阅读全文
摘要:使用readelf -S elfname.o 可以读取一个ELF文件的段信息。 Elf32_Shdr段描述符结构 含义: 常用段信息:
阅读全文