64位系统上链接32位汇编程序

最近在看一本汇编的书,书名为《汇编语言程序设计》(美)布鲁姆,在第四章的事例代码,因为书中的代码都是在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中的函数printfexit所以要指明这个共享库的位置/lib/libc.so.6

可能会遇到的问题

  • 没有/lib/libc.so.6文件
    – 执行yum install -y libc.so.6
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值