程序员的自我修养的笔记(295)

>我来写笔记

按有用程度 按页码先后 最新笔记

  • ziyoudefeng

    ziyoudefeng (娜娜,有你生活真幸福~~)

    本篇笔记全文摘自后面参考文献列出的地址,不过原文中有一些错别字,我这里把错别字改了改,然后也是按照自己机器上代码的结果来进行演示。再结合本书前面第6章“6.5 Linux内核装载ELF过程简介”来进行说明。 1、开始 The question is simple: how does linux execute my main()? Through this document, I'll use the following simple C program to illustrate how it works. It's called "execute_main.c" ...

    2012-12-19 20:41   1人喜欢

  • prife

    prife (相濡以沫,不如相忘于江湖)

    实际上在动态链接器的自举代码中,除了不可以使用全局变量和静态变量之外,甚至不能调用函数,即动态链接器本身的函数也不能调用。这是为什么呢?其实我们在前面分析地址无关代码时已经提到过,实际上使用PIC模式编译的共享对象,对于模块内部的函数调用也是采用外部函数调用一样的方式,即使用GOT/PLT的方式,所以在GOT/PLT没有被重定位之前,自举代码不可以使用任何全局变量,也不可以调用函数。 笔者的疑问主要集中在,..   (6回应)

    2013-02-05 00:26   1人喜欢

  • ziyoudefeng

    ziyoudefeng (娜娜,有你生活真幸福~~)

    过度优化的问题自然很多,这里不再描述。只说解决方法: 可以使用volatile关键字来试图阻止过度优化,volatile基本可以做到两件事情: 1、阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回。 2、阻止编译器调整操作volatile变量的指令顺序。 但即使这样,还是有问题。 因为即使volatile能够阻止编译器调整指令顺序,也无法阻止CPU动态调度换序。下面举例说明: Singleton模式 /..   (2回应)

    2012-12-22 14:21   1人喜欢

  • ziyoudefeng

    ziyoudefeng (娜娜,有你生活真幸福~~)

    /代码内容已省略/ 例如: /代码内容已省略/ 其中: 第一列是VMA的地址范围 第二列是VMA的权限,r代表可读,w代表可写,x代表可执行,p代表私有,s代表共享 第三列是偏移,表示VMA对应的Segment在映像文件中的偏移 第四列是映像文件所在设备的主设备号和次设备号 第五列是映像文件的节点号 最后一列是映像文件的路径

    2012-12-09 21:24   1人喜欢

  • vivi

    vivi (执子之手,将子拖走)

    一、程序的编译过程,目标文件里究竟是什么 从源程序到目标文件的生成过程 最简单的编译命令是gcc helloworld.c,它包含了以下几个步骤: 预处理、编译、汇编、链接,下面分别简介。 预处理:处理#define宏定义、#if #ifdef等条件编译指令、#include预编译指令,删除注释,添加行号和文件名标识,保留所有的#pargma编译器指令,经过预编译后的文件为.i文件。预编译命令为:gcc -E hello.c -o hello.i或者cpp hello.c > ...   (2回应)

    2011-05-06 17:24   5人喜欢

  • knightley

    knightley

    假设我们有一个全局变量叫做var,它在目标文件A里面。我们在目标文件B里面要访问这个全局变量,比如我们在目标文件B里面有这么一条指令: movl $0x2a, var 这条指令就是给这个var变量赋值0x2a,相当于C语言里面的语句var=42。然后我们编译目标文件B,得到这条指令机器码,如图2-9所示。 (图片不方便,如后面:C7 05(mov指令码) 00 00 00 00(目标地址) 2a 00 00 00(源常量)) 由于在编译目标文件B的时候,编译器并不知道...

    2018-07-17 15:08

  • knightley

    knightley

    当某个软件层面要发生变化,却要保持与之相关联的另一方面不变时,加一个中间层即可。Windows API层就是这样的一个“银弹”。 在编译器设计中,IR中间语言也是利用了上述思想。 还有这两天听吴军的“谷歌方法论”,介绍了谷歌翻译的实现过程。当语言数目大起来之后,工作量很大。比如一百种语言相互之间两两的互译大约有一万种语言对(O(n^2))。奥科想了一个便捷的方法——采用几种中间语言,将所有的语言都翻译成这几种中间语...

    2018-04-22 11:03

  • knightley

    knightley

    除了全局对象构造和析构之外,.init和.finit还有其他的作用。由于他们的特殊性(在main之前/后执行),一些用户监控程序性能、调试等工具经常利用它们进行一些初始化和反初始化的工作。当然我们也可以使用“__attribute__(section("init"))”将函数放到.init段里面,但是要注意的是普通函数放在“.init”是会破坏它们的结构的,因为函数的返回指令使得_init()函数会提前返回,必须使用汇编指令,不能让编译器产生“ret”指令。

    2018-04-22 10:44

  • knightley

    knightley

    C语言的运行库从某种程度上来讲是C语言的程序和不同操作系统之间的抽象层,它将不同操作系统的API抽象成相同的库函数。 用户的权限控制、操作系统线程创建等都不是属于标准的C语言运行库。 glibc和MSVCRT事实上是标准C语言运行库的超集。

    2018-04-22 10:39

  • knightley

    knightley

    变长参数的实现得益于C语言默认的cdecl调用惯例的自右向左压栈传递方式。 下面让我们来看va_list等宏应该如何实现。 va_list实际是一个指针,用来指向各个不定参数。由于类型不明,因此这个va_list以void*或char*为最佳选择。 va_start将va_list定义的指针指向函数的最后一个参数后面的位置,这个位置就是第一个不定参数。 va_arg获取当前不定参数的值,并根据当前不定参数的大小将指针移向下一个参数。 va_end将指针清0。

    2018-04-22 10:29

<前页 1 2 3 4 5 6 7 8 9 ... 29 30 后页>

笔记是你写在书页留白边上的内容;是你阅读中的批注、摘抄及随感。

笔记必须是自己所写,不欢迎转载。摘抄原文的部分应该进行特殊标明。

程序员的自我修养

>程序员的自我修养