我在这里写的是一个简单的代码:
printf.asm
[EXTERN main]
section .text
global _start
_start:
call main
add esp, 8
mov eax, 1
xor ebx, ebx
int 80h
和main.c
#include <stdio.h>
int main()
{
char* str = "print from C :\\)";
printf("%s", str);
}
我编译代码如下:
nasm -g -f elf printf.asm -o printf.o
gcc -c -o main.o main.c
ld -o printf printf.o main.o -lc -I/lib/ld-linux.so.2
并运行:
./printf
在终端上没有打印。为什么?
当我使用以下命令ld -Ttext 0x1000 -o printf printf.o main.o -lc -I/lib/ld-linux.so.2
进行链接时,它会显示&#34; Killed&#34;串。如何解决这个问题?
成功获得的代码只是在printf函数中添加了换行符:printf("%s\n", str);
。谢谢大家,问题解决了。
答案 0 :(得分:2)
您试图在没有首先执行C启动代码的情况下调用main()。你不应该这样做。基本上,C启动在跳转到main()之前初始化堆栈和变量存储。
您可以从main()调用汇编语言代码,因为这允许启动首先执行其操作。
答案 1 :(得分:1)
你正在编写_start你自己这是一个libc启动函数。这就是你无法正确链接代码的原因。否则你不应该触摸_start否则你将破坏libc。 要在main之前运行代码,您可以使用''属性((构造函数))''(它是gcc功能,并且在其他编译器中不可用)。
答案 2 :(得分:0)
NASM入口点的混合源以这种方式工作(在我的64位Linux上为32位):
<强> printf.asm:强>
global _start
extern main
extern fflush
section .text
_start:
call main
push 0 ; fflush (stdout)
call fflush
add esp, 4
mov ebx,0 ; exit code, 0=normal
mov eax,1 ; exit command to kernel
int 0x80 ; interrupt 80 hex, call kernel
<强>的main.c 强>
#include <stdio.h>
extern int main (void)
{
char* str = "print from C :\\)\n";
printf("%s", str);
return 0;
}
<强>构建强>
nasm -felf32 -oprintf.o printf.asm
gcc -c -m32 -omain.o main.c
ld -I/lib32/ld-linux.so.2 -lc -m elf_i386 -o printf printf.o main.o
我想你可以管理32位Linux的变化: - )