zynq 的鏈結指令碼

2021-09-20 03:57:34 字數 1575 閱讀 8418

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 鏈結器 的一種。完成的功...