在Nasm引入C函数庫
我们一般只引用C语言的函数库,因为其不包含多态(polymorphism) 并且较原始
比如C++一个函数的名字实际上是经过包装的 call 0x140001870 <_Z4showv> 不方便使用
nasm可以使用extern 函数名来引用外部函数,在link时必须包含该库
所以这时候用gcc来做link会很方便不用一个个找对应文件
来看一个简单例子:
global mainextern puts
section .datamsg: db "Hello", 0
section .textmain: mov rdi, msg call puts wrt ..plt xor rax, rax retextern puts声明有一个外部的函数puts- puts()函数是int puts( const char* str ); 有一个参数rdi指向字串和4 bytes返回值在eax
- call的时候在puts后面加上
wrt ..plt指向PLT表的入口,因为动态链接在汇编阶段不知道libc.so中实际函数地址 - gcc要求程序入口名称用main包装,就像int main() { return 0; }一样的概念
用nasm汇编并使用gcc链接
nasm -f elf64 file.asm -o file.ogcc file.o -o file./file