访问损坏的共享库

Accessing a corrupted shared library

这里是cpuid2.s的代码:

#cpuid2.s view the cpuid vendor id string using c library calls
.section .data
output:
    .asciz "The processor Vendor ID is '%s'\n"

.section .bss
    .lcomm buffer, 12

.section .text
.global _start
_start:
    movl [=10=], %eax
    cpuid
    movl $buffer, %edi
    movl %ebx, (%edi)
    movl %edx, 4(%edi)
    movl %ecx, 8(%edi)
    push $buffer
    push $output
    call printf
    addl , %esp
    push [=10=]
    call exit

我assemble, link, 运行 是这样:

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

我在 Whosebug 上搜索了这个错误。我发现 this question 与我的相似。并且我尝试了@rasion给出的方法。像这样:

as -32 -o cpuid2.o cpuid2.s
ld -melf_i386 -L/lib -lc -o cpuid2 cpuid2.o
ld: cannot find -lc

他的回答没有解决我的问题。我希望有人能帮助我。

我在 GNU 中使用 AT&T 语法 assembler.

我的电脑是 64 位 Ubuntu 14.04.

您已经意识到,您正试图在 64 位机器上为 32 位机器编译程序集。使用您复制和粘贴的命令,您让 asld 知道您正在编译 32 位的东西。

您 运行 遇到的问题是您没有可供 link 反对的 32 位版本的 libc。

apt-get install libc6:i386 libc6-dev-i386

然后 assemble 代码为:

as --32 -o cpuid2.o cpuid2.s

最后 link 它与:

ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cpuid2 -lc cpuid2.o

那么它应该可以工作:

[jkominek@kyatt /tmp]$ ./cpuid2 
The processor Vendor ID is 'GenuineIntel'

如果您想使用 libc,您应该使用入口点 main 而不是 _start。确保你已经安装了 gcc-multilib,然后简单地使用 gcc 编译和 link: gcc -o cpuid2 cpuid2.s。那应该会自动为您做所有正确的事情。