我正在读这本书:“专业汇编语言”。
我想使用动态链接
我在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寄存器中产生有关处理器的不同信息。
信息以一系列位值和标志的形式返回,必须将其解释为正确的含义

此代码利用零选项(移动$ 0,%eax)检索简单的供应商ID
来自处理器的字符串。当零值放在EAX寄存器中时,CPUID指令
执行后,处理器将在EBX,EDX和ECX寄存器中返回Vendor ID字符串,如下所示:
❑EBX包含字符串的低4个字节。
❑EDX包含字符串的中间4个字节。
❑ECX包含字符串的最后4个字节。
字符串值以little-endian格式放置在寄存器中。

该代码使用标准的C库函数:printf和exit而不是linux系统调用。

最佳答案

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

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

关于assembly - GNU汇编器:访问损坏的共享库错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26541955/

10-14 01:28