在ubuntu下用nasm和gcc的ld链接程…

来源:互联网 发布:知乎 长沙的知名企业 编辑:程序博客网 时间:2024/05/21 11:01
我们先写一个.asm文件
[SECTION .data]
StrHello db "Hello, kaito!", 0Ah
HelloLen equ $ - StrHello

[SECTION .text]
global _start ;must be decleared for linker(ld)

_start: ;tell linker entry point
mov edx, HelloLen ;message length
mov ecx, StrHello ;message to write
mov ebx, 1 ;file descriptor(stdout, standard output)
mov eax, 4 ;system call number(sys_write)
int 0x80 ;call kernel
mov ebx, 0
mov eax, 1 ;system call number(sys_exit)
int 0x80 ;call kernel

在nasm中可以指定输出文件格式,其中有如下
valid output formats for -f are (`*' denotesdefault): 
  *bin      flat-form binary files (e.g. DOS .COM,.SYS) 
   ith      Intel hex 
   srec     Motorola S-records 
   aout     Linux a.out object files 
   aoutb    NetBSD/FreeBSD a.out objectfiles 
   coff     COFF (i386) object files (e.g. DJGPP forDOS) 
   elf32    ELF32 (i386) object files (e.g.Linux) 
   elf64    ELF64 (x86_64) object files (e.g.Linux) 
   as86     Linux as86 (bin86 version 0.3) objectfiles 
   obj      MS-DOS 16-bit/32-bit OMF objectfiles 
   win32    Microsoft Win32 (i386) objectfiles 
   win64    Microsoft Win64 (x86-64) objectfiles 
   rdf      Relocatable Dynamic Object File Formatv2.0 
   ieee     IEEE-695 (LADsoft variant) object fileformat 
   macho32  NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) objectfiles 
   macho64  NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) objectfiles 
   dbg      Trace of all info passed to outputstage 
   elf      ELF (short name for ELF32) 
   macho    MACHO (short name for MACHO32) 
   win      WIN (short name for WIN32) 

由于我的虚拟机是i386:x86-64的,所以在编译的时候要选择elf64

nasm -felf64 hello.asm -o hello.o
ld -shello.o -o hello
运行hello文件
./hello
在ubuntu下用nasm和gcc的ld链接程序


如果想要在64位Linux上编译出32位.o文件,则在编译时加上编译选项 -melf_i386