gpt4 book ai didi

assembly - GNU 汇编器 : Accessing a corrupted shared library error

转载 作者:行者123 更新时间:2023-12-02 04:52:34 24 4
gpt4 key购买 nike

我正在看这本书:《专业汇编语言》。
我想使用动态链接
我在 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 寄存器中的 Vendor ID 字符串,如下所示:

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

字符串值以小端格式存放在寄存器中;
此代码使用标准 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 ,在我创建符号链接(symbolic link) /usr/lib/libc.so.1 之后/lib/ld-linux.so.2,它可以工作。
在 64 位 Linux 上创建 32 位 ELF,我们需要 glibc.i686glibc.i386 已安装。

关于assembly - GNU 汇编器 : Accessing a corrupted shared library error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26541955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com