GNU汇编程序:访问损坏的共享库错误

时间:2014-10-24 05:23:22

标签: assembly gnu

我正在读这本书:"专业汇编语言"。
我想使用动态链接 我在GNU汇编程序中使用AT& T语法 我的电脑有Ubuntu 12.04(64位系统) 我试图使用cpuid汇编程序操作码和
来显示供应商ID字符串 printf C函数而不是linux系统调用。

代码hello.s

 .code32
   .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
   addl $8, %esp
   pushl $0
   call exit

我执行了下一个命令:

> $ as -o hello.o hello.s
> $ ld -dynamic-linker /lib/ld-linux.so.2 -o hello -lc hello.o
> $ ./hello
  bash: ./hello: Accessing a corrupted shared library

但我收到上面显示的错误消息,有关已损坏的共享库的信息(这是我要解决的错误)
我不太关心代码(因为我理解它)
我只是想学习如何使用汇编代码和GAS使用动态链接。
所以如果你有任何汇编代码 使用动态链接我很感激,如果你能告诉我" as"和" ld"您使用的命令。

PS:如果有人想了解代码是什么:
CPUID指令使用单个寄存器值作为输入。
EAX寄存器用于确定什么 信息由CPUID指令产生。
根据EAX寄存器的值,CPUID 指令将在EBX,ECX和EDX寄存器中生成有关处理器的不同信息 信息作为一系列位值和标志返回,必须将其解释为正确的含义

此代码使用零选项(movl $ 0,%eax)来检索简单的供应商ID 来自处理器的字符串。当零值放在EAX寄存器和CPUID指令中时 执行后,处理器返回EBX,EDX和ECX寄存器中的供应商ID字符串,如下所示:

❑EBX包含字符串的低4字节。
❑EDX包含字符串的中间4个字节。
❑ECX包含字符串的最后4个字节。

字符串值以little-endian格式放在寄存器中;
此代码使用标准C库函数:printf和exit而不是linux系统调用。

1 个答案:

答案 0 :(得分:0)

我尝试了如下,它的工作原理:

as -32 -o hello.o hello.s
ld -melf_i386 -L/lib -lc -o hello hello.o

顺便说一句,在我的机器上,它抱怨丢失/usr/lib/libc.so.1,在我将符号链接/usr/lib/libc.so.1发送到/lib/ld-linux.so.2之后,它可以正常工作。
在64位Linux上创建32位ELF ,我们需要安装glibc.i686glibc.i386