链接详解--多目标文件的链接

注:1. 可用nm查看文件符号表。

2. 可用readelf -a main查看elf格式文件。

3. bss段:未初始化的数据,block storage start,或better save apace。

以下列程序为例说明:

/* stack.c */

char stack[512];

int top = -1;

void push (char c)

{

  stack[++top] = c;

}

char pop(void)

{

  return stack[top--];

}

int is_empty(void)

{

  return top == -1;

}

/* main.c */

#include <stdio.h>

int a, b=1;

int main(void)

{

  push(‘a‘);

  push(‘b‘);

  push(‘c‘);

  while(!is_empty()){

    putchar(pop());

  }

  putchar(‘\n‘);

  

  return 0;

}

编译过程:gcc main.c stack.c -o main

gcc -c  main.c

gcc -c stack.c

gcc main.o stack.o -o main

main.o包含.bss段:a,.data段:b,.text段:main

stack.o包含.bss段:stack,.data段:top,.text段:push,pop,is_empty

main:包含.bss段:a, stack,.data段:b, top,.text段:main,push,pop,is_empty

main中每个段中来自main.o的变量或函数放在前面,是有gcc的链接顺序决定的。当gcc stack.o main.o -o main时stack相关变量和函数放在main前面。

链接过程是由一个链接脚本(linker script)控制的,链接脚本决定了给每个段分配什么地址,如何对齐,哪个段在前,哪个段在后,哪些段合并到同一个segment,

此外链接脚本还要插入一些符号到最终生成的文件中,例如_bss_start、_edata、_end等。

如果用ld做链接时没有用-T选项指定链接脚本,则使用ld的默认链接脚本,默认链接脚本可以用ld --verbose命令查看。

时间: 2025-01-02 11:22:03

链接详解--多目标文件的链接的相关文章

软链接和硬链接详解

软链接和硬链接详解 导读 Linux下的链接文件有点类似于Windows的快捷方式,但又不完全一样.链接文件有两种:一种是硬链接,另一种是符号链接(又称软链接).下面我给大家说说它们两者之间的区别. 硬链接 硬链接是通过索引节点进行的链接.在Linux中,多个文件指向同一个索引节点是允许的,像这样的链接就是硬链接.硬链接只能在同一文件系统中的文件之间进行链接,不能对目录进行创建.如果删除硬链接对应的源文件,则硬链接文件仍然存在,而且保存了原有的内容,这样可以起到防止因为误操作而错误删除文件的作用

12、Linux软链接和硬链接详解

软连接和硬链接图解 硬链接 符号链接 软链接和硬链接详解 软链接和硬链接详解 Linux下的链接文件有点类似于Windows的快捷方式,但又不完全一样.链接文件有两种:一种是硬链接,另一种是符号链接(又称软链接). UNIX文件系统提供了一种将不同文件链接至同一个文件的机制,我们称这种机制为链接.它可以使得单个程序对同一文件使用不同的名字.这样的好处是文件系统只存在一个文件的副本,系统简单地通过在目录中建立一个新的登记项来实现这种连接. 软连接和硬链接图解 硬链接 硬链接是通过索引节点进行的链接

链接详解--共享库

组成共享库的目标文件和一般目标文件有所不同,在编译时要加-fPIC选项(生成与位置无关代码 Position Independent code). gcc -c -fPIC stack/stack.c stack/push.c stack/pop.c stack/is_empty.c 一般目标文件称为Relocatable(可重定位文件),在链接时可以把目标文件中各段的地址做重定位.

mysql数据库表间内外链接详解

1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制)(2)右外连接(右边的表不加限制)(3)全外连接(左右两表都不加限制) 3. 自连接(同一张表内的连接) SQL的标准语法:select table1.column,table2.column from table1 [inner | left | right | full ] join table2 ontable1.column1 = table2.column2; inner join 表示内连接: left jo

linux cp命令参数及用法详解---linux 复制文件命令cp

linux cp命令参数及用法详解---linux 复制文件命令cp [[email protected]Linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)[[email protected]linux ~]# cp [options] source1 source2 source3 -. directory参数:-a :相当于 -pdr 的意思:-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身:-

Python:file/file-like对象方法详解【单个文件读写】

IO中读写文件操作方法汇总!----The_Third_Wave的学习笔记! 本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创.不定期更新,有错误请指正. Sina微博关注:@The_Third_Wave 如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址. class file(object) |  file(name[, mode[, buffering]]) -> fi

(转)web.config详解之在文件中配置网站默认页面

在<configuration></configuration>中添加下面的配置 <system.webServer>        <defaultDocument>            <files>                <clear />                <add value="index.aspx" />                <add value=&qu

Spring配置文件详解 – applicationContext.xml文件路径

Spring配置文件详解 – applicationContext.xml文件路径 Java编程 spring的配置文件applicationContext.xml的默认地址在WEB-INF下,只要在web.xml中加入代码 1 2 3 4 5 <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener&

动态链接详解

动态链接 动态链接的诞生: 动态链接产生最主要的原因就是静态链接空间浪费过于巨大,更重要的是现阶段各种软件都是模块化开发,不同模块都是由不同厂商开发的,一旦一个模块发生改变,整个软件就需要重新编译(静态链接的情况下). 动态链接主要思想: 把链接这个过程推迟到了运行时再运行,这就是动态链接(Dynamic Linking)的基本思想. 动态链接的好处: 1.动态链接将共享对象放置在内存中,不仅仅节省内存,它还可以减少物理页面的换进换出,也可以提高CPU缓存的命中率,因为不同进程间的数据与指令都集