我正在读这本书:"专业汇编语言"。
我想使用动态链接
我在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系统调用。
答案 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.i686
或glibc.i386
。