簡體   English   中英

你如何獲得指向.text部分的指針?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM