首页 > 其他 > 详细

C与汇编混合编程&&ELF文件格式解析

时间:2014-03-17 17:55:41      阅读:467      评论:0      收藏:0      [点我收藏+]
准备工作:C与汇编的混合编程ELF文件格式解析,这是《自己动手写操作系统》第五章的准备工作,主要讲解C与汇编混合编程的一些知识,并讲解ELF文件的相关知识,为有C语言写操作系统做准备。

1.关于系统调用sys_write

Linux的系统调用通过int 80h实现,用系统调用号来区分入口函数,它的作用类似与dos的中断。

      
        mov edx, len     ; 参数三:字符串长度
        mov ecx, msg     ; 参数二:要显示的字符串
        mov ebx, 1       ; 参数一:文件描述符(stdout) 
        mov eax, 4       ; 系统调用号(sys_write) 
        int 0x80         ; 调用内核功能

2.C与汇编混合编程


2.1 64位机器上目标文件不兼容问题: “could not read symbols"

    如果我们按照书上的命令:

nasm -f -o foo.o foo.asm
gcc -c o bar.o bar.c
ld -s -o foobar foo.o bar.o
    假如你是在64b的机器上,就会收到出错信息:
 “could not read symbols"
    这是因为,你的foo.o &&bar.o 分别是32b的目标文件和64位的目标文件,所以没法使用链接器进行链接。
解决方法:统一使用32b的elf文件,命令如下
gcc -m32 -c -o bar.o bar.c
ld -m elf_i386 -s -o foobar foo.o bar.o

2.2参数传递问题

    如果一个汇编中定义的函数想要被外部程序引用,需要用关键字导出——global;如果汇编中用到其他文件定义的函数,需要对函数进行声明,导入——extern;参数入栈顺序——后面的参数先入栈

3.ELF文件格式解析


3.1.为什么需要了解ELF文件格式

    因为linux可执行内核是采用ELF文件格式的,将ELF格式的内核加载到内存之后,如何将控制权转移到内核——我们如何知道程序开始执行的起始地点相对ELF头的位置?加载内核到内存之后,程序应该如何执行?程序执行的时候使用的都是虚拟地址——在ELF文件格式中提供的都是虚拟地址。那么如何将程序加载到对应的虚拟地址?ELF文件格式中存储了很多冗余信息,程序也包含很多个不同的段,那么如何将这些段分别加载到不同的位置?program header一共有多少个,其中分别在文件中的偏移、长度和加载到虚拟地址的位置信息?

    等等这些信息都需要我们了解ELF文件的格式。


3.2ELF文件格式概览


1)想要了解ELF文件的格式,我们需要熟悉一个命令,xxd,这是一个查看二进制文件的常用指令:
    它的常用参数意义如下:
-u:使用大写字母显示内容;
-a:autoskip自动跳过空数据;
-g num:groupby分组大小 1表示1字节
-c cols:每行显示的列数
-l num:一共显示多少单元
-s +/-num:seek,起始单元多远的地方开始显示

2)elf文件格式与后续的相关部分
    想要了解elf文件的具体信息,可以参考这里:elf文件格式完全解析
与后续内容相关的信息如下:

A、在ELF文件头中,包含程序的入口的虚拟地址;

B、每个段在ELF文件中的位置和大小信息,被加载到虚拟内存的位置和大小信息


C与汇编混合编程&&ELF文件格式解析,布布扣,bubuko.com

C与汇编混合编程&&ELF文件格式解析

原文:http://blog.csdn.net/trochiluses/article/details/21398157

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!