链接-装载与库
萝卜2305
linux,C,嵌入式,Wi-Fi,BLE
展开
-
共享库查找顺序
共享库查找顺序今天开始尝试用Markdown导入一下我在有道云笔记的学习笔记,这是第一篇0x00以下内容的标题序号为查找顺序0x01 环境变量LD_PRELOAD这个不是共享库的路径,而是指定的共享库文件,会最先被装载(无论程序是否依赖他们),由于全局符号介入这个机制,这些库中符号可能会覆盖用户代码或标准C库中的同名全局符号(变量或函数)0x02 环境变量LD_LIBRARY_PATH由冒号隔开的共原创 2016-03-13 13:00:41 · 297 阅读 · 0 评论 -
可执行文件中和动态链接有关的段section
0x01 .interp内容是一个字符串,保存了动态链接器的路径,如/lib/ld-linux.so.2 有几种查看方式: objdump -s a.out readelf -l a.out | grep interpreter0x02 .dynamic保存了动态链接器所需的基本信息,具体可以看elf.h文件或LSB手册: 依赖于哪些共享对象原创 2016-03-14 19:58:05 · 459 阅读 · 0 评论 -
Windows和Linux的进程地址空间分布
Windows的进程地址空间分布 Linux的进程地址空间分布原创 2016-03-14 19:55:57 · 830 阅读 · 0 评论 -
C程序的参数和环境变量
C程序的参数和环境变量原创 2016-03-14 19:54:15 · 388 阅读 · 0 评论 -
FILE,fd和内核对象
fd是打开文件表的下标原创 2016-03-14 19:52:16 · 282 阅读 · 0 评论 -
CRT (C RunTime)执行流程
1、初始化和OS版本有关的全局变量 2、初始化堆 3、初始化IO 4、获取命令行参数和环境变量 5、初始化C库的一些数据 6、调用main并记录返回值 7、检查错误并将main的返回值返回另外,还需要支持调试功能原创 2016-03-14 19:49:47 · 657 阅读 · 0 评论 -
两个特殊的段.init和.finit
.init中的代码在main之前执行 .finit中的代码在main之后执行为了支持C++的全局/静态对象的构造和析构其具体实现和crti.o、crtn.o有关gcc的参数-nostartfile和-nostdlib可以取消链接默认的启动文件和C运行库可以使用attribute((section(“.init”)))来将函数放到.init段中,但是普通函数放在.init中会破坏它的结构,因为函数的原创 2016-03-14 19:49:04 · 1328 阅读 · 0 评论 -
TLS线程局部存储
0x01 TLS (Thread Local Storage)为线程单独提供的私有空间 0x02 gcc中的隐式TLS用法隐式TLS __thread int number;显式TLS pthread_key_create pthread_getspecific pthread_setspecific pthread_key_delete0x03原创 2016-03-13 13:21:44 · 521 阅读 · 0 评论 -
FILE的缓冲模式
0x01 关于这个问题三种缓冲模式: 无缓冲,如stdout 行缓冲,如stderr 全缓冲0x02 文件描述符0,stdin1,stdout2,stderr0x03 缓冲的设置0x04 代码实现stdout重定向到文件 函数dup2,用于复制文件句柄 dup2(int oldhandle, int newhandle);函数f原创 2016-03-13 13:10:00 · 318 阅读 · 0 评论 -
动态链接
0x01 全局偏移表GOTGOT(Global Offset Table) .got位于数据段中,内容是指向全局变量的指针数组0x02 延迟绑定PLTPLT(Procedure Linkage Table) .got.plt位于数据段中,保存函数引用的地址 所有对于外部函数的引用全部被分离出来放到了.got.plt中 .got.plt的前3项具有特殊意义:原创 2016-03-14 20:00:09 · 276 阅读 · 0 评论