成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

鏈接器下——鏈接器實(shí)戰(zhàn)-創(chuàng)新互聯(lián)

鏈接器實(shí)戰(zhàn)

1目標(biāo)

模擬嵌入式開發(fā),編寫一個(gè)“體積受限”的可執(zhí)行程序,通過makefile 完成編譯, 運(yùn)行后打印“D.T.Software”
傳統(tǒng)的寫法:test.c

成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站與策劃設(shè)計(jì),劍河網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:劍河等地區(qū)。劍河做網(wǎng)站價(jià)格咨詢:13518219792
#include <stdio.h>
void main()
{
    print("D.T.Software\n");
    return 0;
}

今天我們采用全新的方法,達(dá)到體積最小的 目標(biāo)。

2分析過程

鏈接器下——鏈接器實(shí)戰(zhàn)

3解決方案

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

4打印函數(shù)設(shè)計(jì)

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退出函數(shù)設(shè)計(jì)

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

6鏈接腳本設(shè)計(jì)

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)

最終的設(shè)計(jì):


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é)果對比:(沒有對比就沒有傷害)
鏈接器下——鏈接器實(shí)戰(zhàn)
還可以使用strip命令進(jìn)一步去除無用調(diào)試信息:
鏈接器下——鏈接器實(shí)戰(zhàn)

8指定鏈接選項(xiàng)

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

    9總結(jié)

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

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文題目:鏈接器下——鏈接器實(shí)戰(zhàn)-創(chuàng)新互聯(lián)
URL標(biāo)題:http://jinyejixie.com/article34/jgepe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、ChatGPT、微信小程序、微信公眾號響應(yīng)式網(wǎng)站、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
都匀市| 汕尾市| 海伦市| 秭归县| 崇仁县| 安图县| 台州市| 大方县| 景宁| 景泰县| 上思县| 迭部县| 九江市| 牙克石市| 磐石市| 桃园县| 潼南县| 佳木斯市| 裕民县| 韶山市| 吉木乃县| 电白县| 英吉沙县| 溧水县| 遂昌县| 益阳市| 保定市| 当涂县| 龙海市| 沁阳市| 县级市| 易门县| 西盟| 达日县| 措勤县| 嘉峪关市| 麻阳| 定西市| 谷城县| 江西省| 定州市|