跳转到内容

在Nasm引入C函数庫

我们一般只引用C语言的函数库,因为其不包含多态(polymorphism) 并且较原始
比如C++一个函数的名字实际上是经过包装的 call 0x140001870 <_Z4showv> 不方便使用

nasm可以使用extern 函数名来引用外部函数,在link时必须包含该库
所以这时候用gcc来做link会很方便不用一个个找对应文件
来看一个简单例子:

global main
extern puts
section .data
msg: db "Hello", 0
section .text
main:
mov rdi, msg
call puts wrt ..plt
xor rax, rax
ret
  • extern 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链接

Terminal window
nasm -f elf64 file.asm -o file.o
gcc file.o -o file
./file