模擬嵌入式開發(fā),編寫一個“體積受限”的可執(zhí)行程序,通過makefile 完成編譯, 運行后打印“D.T.Software”
傳統(tǒng)的寫法:test.c
我們提供的服務(wù)有:做網(wǎng)站、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、朗縣ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的朗縣網(wǎng)站制作公司
#include
void main()
{
print("D.T.Software\n");
return 0;
}
今天我們采用全新的方法,達(dá)到體積最小的 目標(biāo)。
1.通過內(nèi)嵌匯編自定義打印函數(shù)和退出函數(shù)(INT 80H)
2.通過鏈接腳本自定入口函數(shù)(不依賴任何庫和gcc內(nèi)置功能)
3.刪除可執(zhí)行程序中的無用信息(無用段信息、調(diào)試信息、等)
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"
);
}
ENTRY(program)
SECTIONS
{
.text 0x08048000 + SIZEOF_HEADERS :
{
*(.text)
*(.rodata)
}
/DISCARD/ :
{
*(*)
}
}
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)
$(CC) -fno-builtin -o $@ -c $^
rebuild : clean all
all : $(TARGET)
clean :
$(RM) $(TARGET) $(OBJ)
最終的設(shè)計:
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"
);
}
編譯后結(jié)果對比:(沒有對比就沒有傷害)
還可以使用strip命令進(jìn)一步去除無用調(diào)試信息:
對于資源受限的嵌入式設(shè)備,需要考慮可執(zhí)行程序的大小,通過內(nèi)嵌匯編直接使用系統(tǒng)服務(wù)能夠劈開相關(guān)庫的使用可以通過如下方法控制可執(zhí)行程序的體積大小。
1.最小化庫的使用(必要情況下考慮自己實現(xiàn)相關(guān)函數(shù))
2.自定義鏈接腳本,刪除無用段信息
文章整理參考自狄泰課程。