亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

鏈接器下——鏈接器實戰

發布時間:2020-03-04 05:16:05 來源:網絡 閱讀:968 作者:三九感冒靈 欄目:系統運維

鏈接器實戰

1目標

模擬嵌入式開發,編寫一個“體積受限”的可執行程序,通過makefile 完成編譯, 運行后打印“D.T.Software”
傳統的寫法:test.c

#include <stdio.h>
void main()
{
    print("D.T.Software\n");
    return 0;
}

今天我們采用全新的方法,達到體積最小的 目標。

2分析過程

鏈接器下——鏈接器實戰

3解決方案

1.通過內嵌匯編自定義打印函數和退出函數(INT 80H)
2.通過鏈接腳本自定入口函數(不依賴任何庫和gcc內置功能)
3.刪除可執行程序中的無用信息(無用段信息、調試信息、等)

4打印函數設計

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"
    );
}

5退出函數設計

void exit(int code)
{
    asm volatile (
        "movl $1, %%eax\n"
        "movl %0, %%ebx\n"
        "int $0x80     \n"
        :
        : "r"(code)
        : "eax", "ebx"
    );
}

6鏈接腳本設計

ENTRY(program)

SECTIONS
{
    .text 0x08048000 + SIZEOF_HEADERS :
    {
        *(.text)
        *(.rodata)
    }

    /DISCARD/ :
    {
        *(*)
    }
}

7 makefie

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)

最終的設計:


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"
    );
}

編譯后結果對比:(沒有對比就沒有傷害)
鏈接器下——鏈接器實戰
還可以使用strip命令進一步去除無用調試信息:
鏈接器下——鏈接器實戰

8指定鏈接選項

  • -ld 命令 // GNU的鏈接器,將目標文件鏈接為可執行程序,GCC編譯器集成中的一員,重要的幕后工作者
  • -ld -static // 指定使用靜態鏈接的方式來產生最終程序,而不是默認的動態鏈接方式。
  • -gcc -fno-builtin //用于關閉GCC 內置函數的功能(GCC提供了很多內置函數(Built-in Function),它會將一些常用的C庫函數替換為編譯器的內置函數,以達到優化的目的)。

    9總結

    對于資源受限的嵌入式設備,需要考慮可執行程序的大小,通過內嵌匯編直接使用系統服務能夠劈開相關庫的使用可以通過如下方法控制可執行程序的體積大小。
    1.最小化庫的使用(必要情況下考慮自己實現相關函數)
    2.自定義鏈接腳本,刪除無用段信息

文章整理參考自狄泰課程。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

渭源县| 永康市| 喀喇| 樟树市| 泰兴市| 河曲县| 乌审旗| 汉寿县| 都昌县| 凤冈县| 安新县| 汶上县| 高雄市| 库伦旗| 若尔盖县| 阿巴嘎旗| 商丘市| 盐池县| 天津市| 滦南县| 昔阳县| 安溪县| 乐清市| 陵川县| 且末县| 永登县| 宜兴市| 阿勒泰市| 肃宁县| 特克斯县| 珠海市| 杨浦区| 疏附县| 邹城市| 镇安县| 江西省| 平利县| 石楼县| 芦溪县| 项城市| 寻甸|