Risc-V学习日记03
Day7,8
//又去准备面试题摸了一天
GCC(GNU Compiler Collection)
编译器套件
gcc [options][filenames]
{
-E:只做预处理{将"#"开头的<include>是宏语言,将其转换成c语言}
-c:只编译不链接,生成目标文件".o"
-S:生成汇编代码
-o file:把输出生成到由file 指定文件名的文件中
-g:在输出的文件中加入支持调试的信息
-v:显示输出详细的命令执行过程信息
}
GCC的主要执行步骤
"mkdir 文件夹名"创建新文件夹 例子:/mkdir temp
"vi 文件名.c" 例子:/vi hellow.c
(linux terminal基础)
1.注意:进入新文件后无法编辑是正常现象,按下"i"键进入编辑模式
如果不换full的话用不了删除键和方向键
//发现自带的tiny vi真是依托,遂安装vim full
1.卸载tiny
sudo apt-get remove vim-tiny
2.安装full
sudo apt-get install vim
2.进入编辑模式后可以正常编辑,完成代码后按下"esc"键退出编辑模式
3.此时输入"shift"+":"双键最下方弹出命令行:
4.命令行中输入[wq]回车即可完成退回菜单
"gcc 文件名"例子:/gcc hellow.c
此时目录下方生成一个a.out
使用"rm 文件"可删除文件{rm a.out}
"gcc 文件名 -v"给出编译过程
{
1.Editor/vi
2.preprocessor/cc1
gcc -E{预处理去除宏语言} foo.c -o foo.i{输出一个去除了宏语言的.i文件}
3.Compiler/cc1
gcc -S foo.i -o foo.o {c语言转化为汇编语言}
4.Assembler/as
gcc -c foo.s -o foo.o {汇编(as) :汇编器将汇编语言代码转换为机器(CPU)可以执行的指令。}
5.Linker/ld
gcc foo.o -o a.out {链接(Id) :链接器将汇编器生成的目标文件和一些标准库(譬如libc)文件组合,形成最终可执行的应用程序。}
}
Day9,Day10
ELF [(Executable Linkable Format)是一种 Unix-like系统上的二进制文件"格式标准"。]
{
可重定位文件(Relocatable File):
内容包含了代码和数据,可以被链接成可执行文件或共享,目标文件。{有一些地址在编译过程中仍未定义,需要在链接过程中定位地址}
Linux上的.o
可执行文件(Executable File):
可以直接执行的程序
Linux 上的a.out
共享目标文件(Shared Object File):
内容包含了代码和数据,可以作为链接器的输入,在链接阶段和其他的 Relocatable File或者Shared Object File一起链接成新的Object File或者在运行阶段,作为动态链接器的输入,和Executable File 结合,作为进程的一部分来运行
Linux 上的.so
核心转储文件(Core Dump File):
进程意外终止时,系统可以将该进程的部分内容和终止时的其他状态信息保存到该文件中以供调试分析。
}
ELF文件格式
{
Section:
ELF Header:包含ELF的基本信息 [例子:文件运行的架构]
Program Header Table:运行视图
这些描述信息只有运行时会使用到
操作系统加载节(.text,.init,.data,....)时会让节(Section)对齐
问题:假设本来.text大小就是一点点(40byte),结果对齐后占用了很多(40k),浪费了空间
解决:将相同的内容(Section)归并起来(Segment)以节省内存 [例子:假设.text和.init都是可执行文件,将二者归并为一个(Segment)不浪费内存空间]
**常见的(Segment fault)就是你访问了不允许被访问的(Segment),比如修改text代码段等,此时是在内存出错的
.text:
.init:
.data:
.bss:
....
Section Header Table:链接视图(目录)
}
36:31
练习:3-1
gcc -c hello.c
#include <stdio.h>
void main()
{
printf("hello world!\n");
}
readelf -h hello.o //查看 hello.o 的文件的文件头信息
//ctrl + L清空命令行
readelf -S hello.o
或readelf -SW hello.o //查看 hello.o 的 Section header table
gcc -g -c hello.c //对 hello.o 反汇编,并查看 hello.c 的 C 程序源码和机器指令的对应关系
homework:
#include <stdio.h>
int global_init = 0x11111111;
const int global_const = 0x22222222;
void main()
{
static int static_var = 0x33333333;
static int static_var_uninit;
int auto_var = 0x44444444;
printf("hello world!\n");
return;
}
global_init 和 global_const 存放在 ".data" section。
static_var 存放在 ".data" section。
static_var_uninit 和 auto_var 存放在 ".bss" section。
"hello world!\n" 这个字符串存放在 ".rodata" section
Risc-V学习日记03
于 2023-07-29 15:39:25 首次发布