汇编语言程序由定义好的段构成,最常用的三个段:
- 数据段
- BSS段(Block Started by Symbol Segment)
- 文本段
所有汇编语言程序中都必须有文本段,这里是在可执行程序声明指令码的地方。数据段和BSS段是可选的,数据段声明带有初始值的数据元素,BSS段使用零或null初始化数据元素。
GNU汇编器使用.section
命令语句声明段。一般来讲BSS段总应该在文本段之前,数据段可以在文本段之后(不标准)。
GNU汇编器声明一个默认(_start
)标签来指明程序入口,用于表明程序应该从这条指令开始运行,如果没有这个标签链接器(ld)就会打印错误信息,并且它就会试图查找程序的起始点,但是对于复杂的程序,不能保证连接器能正确地作出猜测。
也可以使用_start
之外的其他标签作为起始点。可以使用链接器的 -e参数定义新的起始点的名称。
GCC默认使用main
标签。
除了在应用程序中声明起始标签之外,还需要为外部应用程序提供人口点。这是使用globl命令完成的。
globl命令声明外部程序可以访问的程序标签。如果编写被外部汇编语言或者C语言程序使用的一组工具,就应该使用globl命令声明每个函数段标签。
汇编: as -o xxx.o xxx.s
链接: ld -o xxx xxx.o
使用ld来进行动态链接C库,ld -lc -o xxx xxx.o
-lc
代表链接 libc.so
但是这样链接出来的程序无法正确执行,因为执行时仍然会无法解析对应的C库函数,因为并没有指定动态加载器来加载动态库。-dynamic-linker
参数可以指定运行时的动态库加载程序。
ld -dynamic-linker /lib/ld-linux.so.2 -lc -o xxx xxx.o