最近在看《CSAPP》这本神书,其中看到了第七章链接中的可重定位目标文件,自己动手在ubuntu16.04上试了一试,发现有很多都做了一些改动,在此记录

1.源程序

main.c

static int a = 1;
int buf[2] = {1,2};
void swap();
int main()
{a = 2;swap();return 0;
}

swap.c

extern int buf[];
int *p0 = &buf[0];
static int* p1;
static int p3 = 1;
void swap()
{int temp;p1 = &buf[1];temp = *p0;*p0 = *p1;*p1 = temp;
}

我现在要看的就是代码中的每个符号定义以及引用在经过编译汇编后分别位于.o文件的哪个节中

2.编译与汇编

分别执行

gcc -c main.c

gcc -c swap.c

得到main.o与swap.o

3.以swap.o为例,查看各个节

首先 ,ELF文件的结构

Section

[Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al[ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0[ 1] .text             PROGBITS        0000000000000000 000040 00003c 00  AX  0   0  1[ 2] .rela.text        RELA            0000000000000000 000258 000090 18   I 11   1  8[ 3] .data             PROGBITS        0000000000000000 000080 00000c 00  WA  0   0  8[ 4] .rela.data        RELA            0000000000000000 0002e8 000018 18   I 11   3  8[ 5] .bss              NOBITS          0000000000000000 000090 000008 00  WA  0   0  8[ 6] .comment          PROGBITS        0000000000000000 000090 000036 01  MS  0   0  1[ 7] .note.GNU-stack   PROGBITS        0000000000000000 0000c6 000000 00      0   0  1[ 8] .eh_frame         PROGBITS        0000000000000000 0000c8 000038 00   A  0   0  8[ 9] .rela.eh_frame    RELA            0000000000000000 000300 000018 18   I 11   8  8[10] .shstrtab         STRTAB          0000000000000000 000318 00005e 00      0   0  1[11] .symtab           SYMTAB          0000000000000000 000100 000138 18     12  10  8[12] .strtab           STRTAB          0000000000000000 000238 00001a 00      0   0  1

查看符号表

SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 swap.c
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000000 l    d  .data  0000000000000000 .data
0000000000000000 l    d  .bss   0000000000000000 .bss
0000000000000000 l     O .bss   0000000000000008 p1
0000000000000008 l     O .data  0000000000000004 p3
0000000000000000 l    d  .note.GNU-stack    0000000000000000 .note.GNU-stack
0000000000000000 l    d  .eh_frame  0000000000000000 .eh_frame
0000000000000000 l    d  .comment   0000000000000000 .comment
0000000000000000 g     O .data  0000000000000008 p0
0000000000000000         *UND*  0000000000000000 buf
0000000000000000 g     F .text  000000000000003c swap

可以看到,buf由于是外部变量在这里仅仅是一个重定位项(这一点与CSAPP给的课后题目答案非常不一样,CSAPP给出的是buf在.data节这是不对的),p0,p3由于显示初始化了所以在.data节

同时, readelf -a swap.o可以得到重定位节中的相关信息

重定位节 '.rela.text' 位于偏移量 0x258 含有 6 个条目:偏移量          信息           类型           符号值        符号名称 + 加数
000000000007  000400000002 R_X86_64_PC32     0000000000000000 .bss - 8
00000000000b  000b0000000b R_X86_64_32S      0000000000000000 buf + 4
000000000012  000a00000002 R_X86_64_PC32     0000000000000000 p0 - 4
00000000001e  000a00000002 R_X86_64_PC32     0000000000000000 p0 - 4
000000000025  000400000002 R_X86_64_PC32     0000000000000000 .bss - 4
000000000030  000400000002 R_X86_64_PC32     0000000000000000 .bss - 4重定位节 '.rela.data' 位于偏移量 0x2e8 含有 1 个条目:偏移量          信息           类型           符号值        符号名称 + 加数
000000000000  000b00000001 R_X86_64_64       0000000000000000 buf + 0重定位节 '.rela.eh_frame' 位于偏移量 0x300 含有 1 个条目:偏移量          信息           类型           符号值        符号名称 + 加数
000000000020  000200000002 R_X86_64_PC32     0000000000000000 .text + 0

swap.c中与外部符号有关的部分:

extern int buf[];
int *p0 = &buf[0];

p0与buf需要在链接的时候进行重定位

Ubuntu16.04中的可重定位目标文件相关推荐

  1. 04可重定位目标文件ELF文件解析

    目录 一:可重定位目标文件的特点 二:可重定位目标文件的格式 一:可重定位目标文件的特点 •可被链接(合并)生成可执行文件或共享目标文件 •静态链接库文件由若干个可重定位目标文件组成 •包含代码.数据 ...

  2. 关于可重定位目标文件的格式与其符号表的概述

            我们知道一个可执行的C程序要经过语言预处理.编译器.汇编器生成扩展名为.o的可重定位目标文件,再通过链接器链接生成可执行的目标文件. 1.什么是可重定位目标文件        一个扩展 ...

  3. 可重定位目标文件(REL)的符号和符号表

    可重定位目标文件由汇编器as生成,包含了当前模块定义的符号及引用的外部模块符号信息,可以与其他可重定位目标文件链接为一个可执行目标文件. 有三种不同类型的符号,第一种,由当前模块定义的全局符号:第二种 ...

  4. Linux热点无网络,Linux网络配置:手提在连接WIFI热点情况下,Ubuntu16.04中怎样配置网络?...

    Linux网络配置:手提在连接WIFI热点情况下,Ubuntu16.04中怎样配置网络?,范佩西致敬温格:你是我的足球父亲,是你塑造了我,磷菩屹倨竿,布加迪推出Chiron Sport特别版,百公里加 ...

  5. 在ubuntu16.04中一键创建LAMP环境 新系统

    在ubuntu16.04中一键创建LAMP环境 执行命令apt-get update. 执行命令apt-get install lamp-server^. 在安装过程中会跳出Mysql数据库root用 ...

  6. ubuntu16.04中IDEA无法输入中文问题

    问题: Ubuntu16.04中,IDEA下面无法切换搜狗输入法及其他输入法,无法输入中文,但是原来可以正常输入中文 解决: 在IDEA的bin目录下的idea.sh文件的前面加上 export XM ...

  7. Ubuntu16.04中安装Kermit

    在Ubuntu16.04中安装Kermit的方法有两种:apt-get安装和源码编译安装,下面分别这两种方法进行说明. 1 apt-get安装 根据参考资料[1][2]的说明,可以通过面的命令安装Ke ...

  8. Ubuntu16.04中常用软件QQ,WPS,搜狗,CLion,Pycharm等安装

    Ubuntu16.04中常用软件QQ,WPS,搜狗输入法,CLion,Pycharm等安装 1.QQ链接: https://im.qq.com/linuxqq/index.html sudo dpkg ...

  9. 4.Ubuntu16.04中SNMP配置

    Ubuntu16.04中SNMP配置 SNMP服务配置 zabbix在监控网络设备或者打印机等设备时,需要用到SNMP,单独在被监控的客户端配置SNMP即可 端口:161 1.安装SNMP 服务端:s ...

最新文章

  1. Site Group Level Price Maintenance in IS Retail
  2. 2020最新Java面试题(java,JavaWeb,数据库,框架),常见面试题及答案汇总
  3. DEDEv5.6跳转网址修改成直链地址而非动态跳转
  4. 怎么查看java的引用类_一段代码看 Java 引用类型
  5. 有赞美业微前端的落地总结
  6. 好用的重装系统前使用的windows系统软件名称导出备份工具
  7. 基于android的考勤管理系统,基于Android的考勤管理系统的设计与实现
  8. fanuc机器人码垛编程实例_两个很简单的FANUC系统CNC加工中心编程实例
  9. 【SpringBoot】SpringBoot最精简的设置
  10. 视频质量,分辨率以及码率之间的关系
  11. PyCharm中导入数据分析库
  12. 获取计算机登录用户名和密码,查看电脑的登录用户名_查看电脑用户名和密码...
  13. 基于R语言绘制标准化平均差(Standardized mean difference SMD)可视化图(1)
  14. 详解视频封装格式之MP4
  15. php开源论坛系统,十款开源论坛系统推荐(二)
  16. PostgreSQL多维空间对象——cube插件
  17. 推荐一个DNS解析商:CloudXNS
  18. Guava布隆过滤器(boomfilter)使用简介
  19. WorkNC在福田模具的应用
  20. linux进阶-MySQL索引小结

热门文章

  1. ASP-常量,asp运算符,比较运算符
  2. [Cocoa]深入浅出Cocoa之Core Data(4)- 使用绑定
  3. 《Java程序员,上班那点事儿》序——刘博
  4. SecureCRT设置和Xshell一样的快速命令集(使用快捷键输入命令和密码)
  5. 动态调频DVFS_转
  6. Kruskal HDOJ 1233 还是畅通工程
  7. Ubuntu下vi编辑器方向键变成字母的解决方法
  8. 浏览器缓存详解:expires,cache-control,last-modified,etag详细说明
  9. 主流浏览器的HTTP最大并发连接数
  10. java 快排和堆排序