访问损坏的共享库

时间:2015-05-24 03:42:56

标签: assembly x86 32bit-64bit

以下是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 $0, %eax
    cpuid
    movl $buffer, %edi
    movl %ebx, (%edi)
    movl %edx, 4(%edi)
    movl %ecx, 8(%edi)
    push $buffer
    push $output
    call printf
    addl $8, %esp
    push $0
    call exit

我组装,链接和运行它:

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

我已经在StackOverflow中搜索了此错误。我发现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语法。

我的电脑有64位Ubuntu 14.04。

2 个答案:

答案 0 :(得分:4)

正如您已经意识到的那样,您正在尝试在64位计算机上编译32位计算机的程序集。使用您复制和粘贴的命令,您可以让asld知道您正在编译32位内容。

您遇到的问题是您没有可以链接的32位版本的libc。

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

然后用以下代码汇编代码:

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

最后将其链接到:

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'

答案 1 :(得分:0)

如果您想使用libc,则应使用入口点main而不是_start。确保已安装gcc-multilib,只需使用gcc编译并链接:gcc -o cpuid2 cpuid2.s。这应该会自动为你做所有正确的事情。