我正在读这本书:“专业汇编语言”。
我想使用动态链接。
我在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.i686
或glibc.i386
。关于assembly - GNU汇编器:访问损坏的共享库错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26541955/