首页 > 编程语言 >《程序员的自我修养》第四章学习笔记

《程序员的自我修养》第四章学习笔记

时间:2023-08-24 10:13:29浏览次数:42  
标签:文件 ab int 程序员 地址 修养 main 链接 第四章

 2015.12.26的笔记,放在了草稿箱。2023.8.24发布一下吧。

第四章 静态链接

 先上两个文件

// a.c

extern int shared;

int main()
{
     int a = 100;
    swap(&a, &shared);
} 
// b.c

int shared = 1;

void swap(int *a, int *b)
{
    *a ^= *b ^= *a ^= *b;
}

 再来只编译不链接
$ gcc -c a.c b.c

最后用ld链接器进行链接

$ ld a.o b.o -e main -o ab     // -e main 表示将main函数作为程序入口

这样 就一共有了三个目标文件  a.o   b.o   ab

 

4.1 空间与地址分配

 a.o b.o 链接生成 ab。 对于多个输入目标文件,链接器如何将它们的各个段合并到输出文件。

 

4.1.1 按序叠加:简单的将各个目标文件文件依次合并。 造成空间浪费(因为每个段都需要有一定的地址和空间对齐要求)。

 

4.1.2 相似段合并:将相同性质的段合并到一起。 a.o的.text 和 b.o的.text 合并成 ab的.text。其他的段也类似。

1,“链接器为目标文件分配地址和空间”:“地址和空间”有两层含义,一是在输出的可执行文件中的空间。二是在装载后的虚拟地址中的虚拟地址空间。

2,链接器空间分配的策略采用一种叫两步链接的方法(分成两步)

  (1)第一步 空间与地址分配:扫描所有输入目标文件,获取它们的各个段的长度、属性和位置,将输入目标文件中的符号表中所有的符号定义和符号引用搜集起来,同意放到一个全局符号表中。

    这一步中链接器将能够获得所有输入目标文件的段长度,并且将它们合并,计算输出文件各个段合并后的长度和位置,并建立映射关系。

  (2)第二步符号解析和重定位: 使用上面搜集到的信息,读取输入文件段中的数据、重定位信息,并且进行符号解析与重定位、调整代码中的地址。

3,$ ld a.o b.o –e main –o ab     -e main 表示将main函数作为程序入口。ld链接器默认的程序入口为 _start。

4,在Linux下,ELF可执行文件默认从地址0x08048000开始分配。

5,用objdump来查看链接前后地址的分配情况

 $ objdump -h a.o

 $ objdump -h b.o

 $ objdump -h ab

File off:文件偏移

Size:大小

VMA:Virtual Memory Address 虚拟地址(我们主要关心这个和Size)

LMA:Load Memory Address 加载地址

正常情况下 LMA VMA应该是一样的,但是在有些嵌入式系统中,这两个有可能是不一样的。

说明:

1)在链接之前,目标文件的VMA都是0,因为虚拟空间还没有被分配。链接之后,可执行文件ab中的各个段都被分配到了相应的虚拟地址。

2)在Linux下,ELF可执行文件默认从地址0x08048000开始分配。

 

4.1.3 符号地址的确定

 

标签:文件,ab,int,程序员,地址,修养,main,链接,第四章
From: https://www.cnblogs.com/xcywt/p/5078214.html

相关文章

  • 第四章 串
    一、串的定长顺序存储#defineMAXLEN255typedefstruct{ charch[MAXLEN]; intlength;}SString;二、朴素模式匹配算法O(mn) intIndex(SStringS,SStringT) { inti=1,j=1; while(i<=S.length&&j<=T.length) { if(S.ch[i]==T.ch[j])//匹配,继......
  • C++面向对象笔记(转载自黑马程序员)
    C++核心编程本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓。1内存分区模型C++程序在执行时,将内存大方向划分为4个区域代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的......
  • MongoDB :第四章:集合的创建与删除
    MongoDB创建集合本章节我们为大家介绍如何使用MongoDB来创建集合。MongoDB中使用createCollection()方法来创建集合。语法格式:db.createCollection(name,options)参数说明:name:要创建的集合名称options:可选参数,指定有关内存大小及索引的选项 options可以......
  • 【译】掌握这些策略,公司轻松留住顶级程序员!
    我们是家专注于提供高品质软件开发服务的小公司,最近和一家在全球有业务的大公司签了合同,负责一个大型项目。工程日期只给了八个月,实在是太紧了。所以,我们打算扩大团队来应对这个挑战。我们新招了一位工程师。刚开始,我们分配给他一些基础性的工作,如文档更新、错误修复以及回归测试......
  • 6款程序员必备的 Chrome 扩展插件!逼格秒提升
    美化JustBlack午夜黑主题简介:Chrome官方团队出品的黑色主题皮肤,值得拥有!推荐指数:⭐⭐⭐⭐⭐下载链接:https://www.chajianxw.com/themes/18893.htmlDarkReader暗黑主题简介:能在任何网站上开启夜间模式,同时,它还支持自定义调整亮度、对比度,应用棕褐色滤镜、黑暗模式,设置字体和忽......
  • 11 款程序员必备的 Chrome 扩展插件! 提升开发效率!
    Octotree树形菜单简介:Octotree是一款增强GitHub代码审查和探索的浏览器扩展,可以非常方便帮助您查阅代码。推荐指数:⭐⭐⭐⭐⭐下载链接:https://www.chajianxw.com/developer/11032.html划词翻译简介:一站式划词/截图/网页全文/音视频翻译扩展,支持谷歌、DeepL、百度、搜狗等......
  • Kotlin-大师班 第四章-随笔
    1.init()Kotlin中,当对象被创建时,调用init()做初始化。 2.  Kotlin的函数参数都是val类型的,都不可修改。Kotlin的函数参数在函数中不可修改。 3.避免出现shadow的情况。举个例子:就是函数内定义了一个变量,变量名和参数名相同。这样一来函数内变量就把函数参......
  • 20+完整的商业实战项目,手把手教你成为将军式程序员
    常常有朋友问我:“如何提高自己的开发能力?”、“如何拿到大厂offer”、“我想成为行业大牛,编程专家,但总感觉自己在原地踏步,该怎么办?”......在寻找答案的过程中,有些人把原因归咎到企业对前端的重视程度不够,有些外在因素固然重要,它们可能会导致你在当时企业的怀才不遇。但是你确定自......
  • 一代程序员集体有始有终
         疾风知劲草,老马识归途。在今这个翻过篇章的夏天,缤纷真小米的收获季,小米集团的跨长河之作,十三香巨人觉醒,风芒皆俱。运营、移动up、互联网又来到了台风口,一夜的守着屏,心中不免提着点滴。    洪流下的世界是个辩证体,野心家鼓吹恐怖的美苏世界争霸,横行无忌,而作......
  • 中年失业程序员,居家做亚马逊。
    中年失业程序员,居家做亚马逊。同学中年失业了,之前做程序员。应该说是本本份份的人。代码能力还是有的。无奈,现实残酷。现在开始居家做亚马逊。一头雾水,完全不同的两个事情,两种思维方式。很难适应。另外,虽然是写代码,但是英语并不好。阻力很大。但是没有退路。我看他经常做的事,然后......