最近在看一本汇编的书,书名为《汇编语言程序设计》(美)布鲁姆,在第四章的事例代码,因为书中的代码都是在IA-32的环境下,而我自己的电脑是AMD64架构的(其实就是X86_64),按照书中的方式链接不成功,这里记录下解决办法。
代码
文件名为cpuid2.s
# cpuid.s 打印cpu处理器的厂商信息
.section .data
output:
.asciz "the processor vendor id is '%s'\n"
.section .bss
.lcomm buffer, 12
.section .text
.globl _start
_start:
movl $0, %eax
cpuid
movl $buffer, %edi
movl %ebx, (%edi)
movl %edx, 4(%edi)
movl %ecx, 8(%edi)
# 把参放到堆栈:
pushl $buffer
pushl $output
call printf
# 修改堆栈指针,清空printf函数放入堆栈的参数
addl $8, %esp
pushl $0
call exit
汇编为目标文件
as --32 -o cpuid2.o cpuid2.s
这里要添加–32表明是Intel i386架构的,即IA-32架构
链接
ld -melf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cpuid2 cpuid2.o /lib/libc.so.6
这里使用了动态共享库(
/lib/libc.so.6
),所以要指明动态链接库的位置,动态链接库本身也是一个动态共享库,作用是在可执行文件加载时通过动态链接库动态链接共享库(哈哈,说的好像有点绕,但我说的是对的,没有瞎扯淡),我们需要通过dynamic-linker /lib/ld-linux.so.2
指明位置。
因为汇编代码中有使用到libc.so.6中的函数printf
和exit
所以要指明这个共享库的位置/lib/libc.so.6
可能会遇到的问题
- 没有
/lib/libc.so.6
文件
– 执行yum install -y libc.so.6