学习自唐佐林老师,仅作为个人笔记
方向:如何设计一个体积受限的可执行程序,内容只有打印一行字符串
解决思路:
怎样做到体积最小?
1 独立于 libc 库进行编译链接
2 独立于 其他 一些无关的或者说仅仅使用了一点点部分的第三方库
总之尽量减少使用其他的库
所以需要自己定义链接脚本,因为既然独立于 libc库,也就是说需要自己指定入口函数了,不再使用默认的_start 入口函数了
3 不依赖 libc 库的 printf(),自己直接使用内嵌汇编调用系统服务进行字符串打印!!






链接脚本 只留代码段 和 只读数据段,因为字符串位于只读数据段,其余不用的段屏蔽。并且冲定义入口函数
链接脚本
ENTRY(program)
SECTIONS
{
.text 0x08048000 + SIZEOF_HEADERS :
{
*(.text)
*(.rodata)
}
/DISCARD/ :
{
*(*)
}
}
Makefile
CC := gcc
LD := ld
RM := rm -fr
TARGET := program.out
SRC := $(TARGET:.out=.c)
OBJ := $(TARGET:.out=.o)
LDS := $(TARGET:.out=.lds)
.PHONY : rebuild clean all
$(TARGET) : $(OBJ) $(LDS)
#静态链接
$(LD) -static -T $(LDS) -o $@ $<
@echo "Target File ==> $@"
$(OBJ) : $(SRC)
#关闭 GCC 内置函数功能,不优化编译
$(CC) -fno-builtin -o $@ -c $^
rebuild : clean all
all : $(TARGET)
clean :
$(RM) $(TARGET) $(OBJ)
C文件
void print(const char* s, int l);
void exit(int code);
void program()
{
print("D.T.Software\n", 13);
exit(0);
}
void print(const char* s, int l)
{
asm volatile (
"movl $4, %%eax\n"
"movl $1, %%ebx\n"
"movl %0, %%ecx\n"
"movl %1, %%edx\n"
"int $0x80 \n"
:
: "r"(s), "r"(l)
: "eax", "ebx", "ecx", "edx"
);
}
void exit(int code)
{
asm volatile (
"movl $1, %%eax\n"
"movl %0, %%ebx\n"
"int $0x80 \n"
:
: "r"(code)
: "eax", "ebx"
);
}

345



被折叠的 条评论
为什么被折叠?



