访问损坏的共享库
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 位机器编译程序集。使用您复制和粘贴的命令,您让 as
和 ld
知道您正在编译 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
。那应该会自动为您做所有正确的事情。
这里是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 位机器编译程序集。使用您复制和粘贴的命令,您让 as
和 ld
知道您正在编译 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
。那应该会自动为您做所有正确的事情。