gnu汇编程序printf错误

时间:2013-05-14 21:28:54

标签: assembly printf

我的操作系统是ubuntu 13.04 64位


我浪费了很多时间来解决它 真的需要你的帮助

此test.s返回

Accessing a corrupted shared library






.code32

.section .data
par1:
.int 33
msg:
.asciz "%d\n"
.section .text
.globl _start
_start:
pushl $par1
pushl $msg
call printf



cikis:
movl $1,%eax
movl $1,%ebx
int $0x80

ldd test.out

ldd test.out
    linux-vdso.so.1 =>  (0x00007fff615fe000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbfb56f8000)
    /lib32/libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x00007fbfb5ae0000)

生成文件

as test.s -o test.o
ld -dynamic-linker /lib/ld-linux.so.2 -lc test.o -o test.out

//我也试过

ld -dynamic-linker /lib32/ld-linux.so.2 -lc test.o -o test.out

如何在64位ubuntu上使用气体中的C函数

1 个答案:

答案 0 :(得分:0)

更改汇总和关联计划的方式以及如何推送$par1而不是par1

.section .data
n:
.int 33
fmt:
.asciz "n: %d\n"
.section .text
.global _start
_start:
pushl n
pushl $fmt
call printf

movl $1, %eax
movl $0, %ebx
int $0x80

汇总并链接:

cc -nostdlib -Os -Wall -g3 -m32 -lc printf-x86.S -o printf-x86

cc 这里只是 gcc 的别名。常规编译器驱动程序将知道传递给的正确选项 ld 加上它意味着汇编器源(.S)通过C预处理器传递并且您可以使用标头像<sys/sdt.h>这样的文件。

这是一个GNU make片段,以备不时之需:

%: %.S
        $(CC) -nostdlib $(CFLAGS) $(LDFLAGS) $< -o $@
printf-x86: CFLAGS+=-m32
printf-x86: LDFLAGS+=-lc