vivado使用的編譯器是gcc,因此zynq的鏈結指令碼如同其他使用gcc編譯的專案一樣。這裡使用u-boot的鏈結指令碼為例,簡單描述怎麼使用鏈結指令碼增加cli的功能。
這裡不描述鏈結指令碼的語法等內容。
在u-boot中,使用頻率頗高的巨集類似:
u_boot_cmd(
bootm, config_sys_maxargs, 1, do_bootm,
);
u_boot_cmd巨集定義為
#define u_boot_cmd(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name struct_section =
#define struct_section __attribute__ ((unused,section (".u_boot_cmd")))
struct cmd_tbl_s ;
可知, u_boot_cmd展開後即是cmd_tbl_s 結構體, 名稱是__u_boot_cmd_***,而他指定的鏈結段是
".u_boot_cmd"
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd :
__u_boot_cmd_end = .;
那麼u-boot是怎麼使用這些的,比如掃瞄這個段裡面的命令呢?
最簡單的例子, 根據命令名,判斷是否支援
cmd_tbl_t *find_cmd (const char *cmd)
} if (n_found == 1)
return null; /* not found or ambiguous command */
}
由上可以得到基於vivado的zynq鏈結指令碼的使用
新增.cli_cmd欄位
. = .;
__cli_cmd_start = .;
.cli_cmd : > ps7_ddr_0 // > ps7_ddr_0這個根據硬體適配,參考上下文可以得到
__cli_cmd_end = .;
怎麼引用__cli_cmd_start和__cli_cmd_end呢,很簡單
extern cmd_tbl_t __cli_cmd_start,__cli_cmd_end;
掃瞄呢?
static int getcmd(const char *name, cmd_tbl_t **cmd)
} return found;
}
在elf檔案裡面可以看到:
最終得到類似命令列效果如下:
uboot鏈結指令碼
gnu編譯器生成的目標檔案預設為elf格式,elf檔案由若干段 section 組成,如不特殊指明,由c源程式生成的目標 中包含如下段 text 正文段 包含程式的指令 data 資料段 包含固定的資料,如常量 字串 bss 未初始化資料段 包含未初始化的變數 陣列等。c 源程式生成的目標 中還包括...
鏈結指令碼(1)
1 什麼是ld?它有什麼作用?ld是gnu binutils工具集中的乙個,是眾多linkers 鏈結器 的一種。完成的功能自然也就是鏈結器的基本功能 把各種目標檔案和庫檔案鏈結起來,並重定向它們的資料,完成符號解析。linking其實主要就是完成四個方面的工作 storage allocation...
鏈結指令碼(1)
分類 鏈結指令碼 makefile 2012 05 17 20 49 1126人閱讀收藏 舉報 指令碼linker makefile allocation file flash 1 什麼是ld?它有什麼作用?ld是gnu binutils工具集中的乙個,是眾多linkers 鏈結器 的一種。完成的功...