《程序员的自我修养-链接,装载与库》
TinyHelloWorld.c
char* str = "Hello World!\n";
void print()
{
asm("movl $13,%%edx \n\t"
"movl %0,%%ecx \n\t"
"movl $0,%%ebx\n\t"
"movl $4,%%eax \n\t"
"int $0x80 \n\t"
::"r"(str):"edx","ecx","ebx");
}
void exit()
{
asm("movl $42,%ebx \n\t"
"movl $1,%eax \n\t"
"int $0x80 \n\t"
);
}
void nomain()
{
print();
exit();
}
gcc -c -fno-builtin -m32 tinyhelloworld.c
ld -static -e nomain -o tinyhelloworld tinyhelloworld.o -melf_i386
arm32
char *str = "Hello World!\n";
//ssize_t write(int fd, const void *buf, size_t count);
void print()
{
asm("mov r2, #13 \n\t"
"mov r1, %0 \n\t"
"mov r0, #1 \n\t"
"mov r7, #4 \n\t"
"svc 0x0 \n\t"
::"r"(str):);
}
void exit()
{
asm("mov r0, #0 \n\t"
"mov r7, #1 \n\t"
"svc 0x0 \n\t"
);
}
void nomain()
{
print();
exit();
}
Makefile如下
.PHONY : all clean
CC = arm-none-linux-gnueabi-gcc
LD = arm-none-linux-gnueabi-ld
DUMP = arm-none-linux-gnueabi-objdump
CFLAGS = -nostdlib -fno-builtin
LFLAGS = -static -e nomain
tinyhelloworld: tinyhelloworld.c
$(CC) -c $(CFLAGS) $^
$(LD) $(LFLAGS) $@.o -o $@
$(DUMP) -d $@ > $@.dis
clean:
rm -rf tinyhelloworld.o tinyhelloworld tinyhelloworld.dis
arm64
char *str = "Hello World!\n";
//ssize_t write(int fd, const void *buf, size_t count);
void print()
{
asm("mov x2, #13 \n\t"
"mov x1, %0 \n\t"
"mov x0, #1 \n\t"
"mov x8, #64 \n\t"
"svc 0x0 \n\t"
::"r"(str):);
}
void exit()
{
asm("mov x0, #0 \n\t"
"mov x8, #93 \n\t"
"svc 0x0 \n\t"
);
}
void nomain()
{
print();
exit();
}
Makefile如下
.PHONY : all clean
CC = aarch64-linux-android-gcc
LD = aarch64-linux-android-ld
DUMP = aarch64-linux-android-objdump
CFLAGS = -nostdlib -fno-builtin
LFLAGS = -static -e nomain
tinyhelloworld: tinyhelloworld.c
$(CC) -c $(CFLAGS) $^
$(LD) $(LFLAGS) $@.o -o $@
$(DUMP) -d $@ > $@.dis
cp $@ $@_64
clean:
rm -rf tinyhelloworld.o tinyhelloworld tinyhelloworld.dis