[英]How do you get a pointer to the .text section?
如何從該程序中獲取指向程序內存的.text部分的指針? 我還需要該部分的長度來進行“Flash to Memory”比較,作為在后台運行的連續自測試的一部分。
工具集自動為我正在使用的工具生成鏈接器.cmd文件,而我正在使用的板的Board Support Package要求我使用生成的.cmd文件而不是自己生成。 (沒有make文件要么在后面添加一個腳本來粘貼它。)
編輯:我正在使用代碼編輯器3.1環境的TI TMS 6713 DSP。 我正在使用的卡是由我們的客戶簽約並由另一個組織生產的,因此我無法真正指出您的任何信息。 然而,BSP依賴於TI的“DSP BIOS”配置工具,如果不進行超出范圍的工作,我無法真正捏造設置太多。
您需要在鏈接描述文件中放入“變量”。
在我的一個項目中,我在我的一個部分中有這個:
__FlashStart = .;
在C程序中我有這個:
extern unsigned long int _FlashStart;
unsigned long int address = (unsigned long int)&_FlashStart;
如果你可以修改鏈接器腳本肯定會更容易。 由於您不能,可以從程序二進制文件中提取節名稱,地址和大小。 例如,以下是如何使用libbfd檢查所有代碼段。
#include <bfd.h>
bfd *abfd;
asection *p;
char *filename = "/path/to/my/file";
if ((abfd = bfd_openr(filename, NULL)) == NULL) {
/* ... error handling */
}
if (!bfd_check_format (abfd, bfd_object)) {
/* ... error handling */
}
for (p = abfd->sections; p != NULL; p = p->next) {
bfd_vma base_addr = bfd_section_vma(abfd, p);
bfd_size_type size = bfd_section_size (abfd, p);
const char *name = bfd_section_name(abfd, p);
flagword flags = bfd_get_section_flags(abfd, p);
if (flags & SEC_CODE) {
printf("%s: addr=%p size=%d\n", name, base_addr, size);
}
}
如果您只想查看.text段,則可以對段名進行strcmp。
這種方法的缺點是什么? Libbfd是根據GPL許可的,因此您的整個項目將受到GPL的限制。 對於商業項目,這可能是一個非首發。
如果您的二進制文件是ELF格式,則可以使用libelf。 我不熟悉libelf API的工作方式,所以我無法提供示例代碼。 Linux libelf也是GPL,但我相信BSD項目有自己的libelf,你可以使用它。
編輯:當您在最小的實時操作系統環境中處理DSP時,這個答案是行不通的。 對不起,我試過了。
您能澄清一下您感興趣的工具鏈和架構嗎?
在我現在使用的編譯器(IAR ARM C / C ++)上,編譯器內置了運算符,它返回段開始地址__sfb(...)
,段結束地址__sfe(...)
和段大小__sfs(...)
您要查找的符號分別是__text__
和__etext__
,它們分別指向.text
部分的開頭和結尾。
您可能會發現生成的.map
文件很有用,因為它列出了應用程序中定義的所有符號和部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.