因为汇编程序被转化成可执行文件时,连接器必须知道指令码中的起始地址。为了解决这个问题,GUN汇编器声明一个默认标签,或者说是标志符,它就是_start。如果连接器找不到_start,就会生成错误信息;错误信息我就不贴出来了。当然也可以使用_start以为的标签作为起始地点;但是必须通过-e来说明。
比如有一个汇编文件cpuid.s;它转化成可执行的文件cpuid。是通过:
as -o cpuid.o cpuid.s #起始标签为_start
ld -o cpuid cpuid.o
或:
as -o cpuid.o cpuid.s #起始标签为_start1
ld -e _start1 -o cpuid cpuid.o
我们知道GCC它不仅能编译汇编语言,还能编译高级语言如C语言。那么GCC它又是以什么标签来作为起始地址?我们知道C语言中至少有main函数;所以main便是gcc要找的标签。如果要用gcc来编译上面的cpuid.s,必须把源文件中的
.globl _start
_start:
改为.globl main
main:
不知道大家明白了不。 |