關於lds檔案中段名在c檔案中的使用

2021-10-03 09:26:12 字數 1156 閱讀 5295

//鏈結指令碼

sections         /***段*/

.rodata :         /*唯讀資料段*/

. = align(4);        

.data :         /*資料段*/

. = align(4);        

__bss_start = .;        /*bss段起始位址設為當前位址*/

.bss :         /*bss段 以及通用符號段*/

__bss_end = .;        

}

//清除bss段

void clean_bss(void)

上面的**時以前自己寫u-boot中用到了c函式清除bss段,引用段名的方法是int *p = &__bss_start;一直以為引用段名是固定寫法。直到今天看到了linux-4.19-rc3中使用段名的方法才發現端倪。

static const void * __init arch_get_next_mach(const char *const **match)

4.19核心中有這麼乙個函式,功能是取得.arch.info.init段中每個結構體的dt_compat成員,功能上沒什麼問題,就是對引用段名的方式出現了疑問,這個地方的引用的方法和以前的認知有點不同。

我在核心中搜尋了__arch_info_begin,得到了以下的結果

extern const struct machine_desc __arch_info_begin, __arch_info_end;

#define for_each_machine_desc(p) \

for (p = __arch_info_begin; p < __arch_info_end; p++)

__arch_info_begin被宣告成了乙個結構體陣列,所以在arch_get_next_mach()函式中才能使用指標進行引用。

static const struct machine_desc *mdesc = __arch_info_begin;
這樣就得到了乙個結論:段名的引用其實和宣告有關,而不是簡單的固定寫法。

u boot中 lds鏈結指令碼檔案的分析

對於.lds檔案,它定義了整個程式編譯之後的連線過程,決定了乙個可執行程式的各個段的儲存位置。sections region phdr fill secname和contents是必須的,其他的都是可選的。下面挑幾個常用的看看 1 secname 段名 2 contents 決定哪些內容放在本段,可...

在C 中讀寫INI檔案

ini 檔案就是擴充套件名為 ini 的檔案。在windows系統中,ini檔案是很多,最重要的就是 system.ini system32.ini 和 win.ini 該檔案主要存放使用者所做的選擇以及系統的各種引數。使用者可以通過修改ini檔案,來改變應用程式和系統的很多配置。但自從window...

在C 中呼叫EXE檔案

1.如果exe檔案的返回值是int型別,標識操作執行的結果是否成功,例如 class program 則在呼叫exe檔案時,可以用如下方法 process myprocess new process string filename c test.exe string para 你好 北京歡迎你!pr...