2008-10-14 53 views
6

如何從該程序中獲取指向程序內存的.text段的指針?我還需要將該部分的長度作爲在後臺運行的連續自檢的一部分進行「Flash to Memory」比較。如何獲得.text部分的指針?

的工具集自動生成我使用的工具鏈接.cmd文件,以及板級支持包的我使用的板需要我用生成的.cmd文件,而不是使我自己的。 (沒有使文件添加腳本來彌補它的後綴。)

編輯: 我正在使用代碼作曲家3.1環境的TI TMS 6713 DSP。我使用的卡片是由我們的客戶簽訂的,由另一個組織製作,所以我不能指出您的任何信息。然而,BSP依賴於TI的「DSP BIOS」配置工具,如果不進行超出範圍的努力,我無法真正對設置進行欺騙。

回答

4

您需要將「變量」放入鏈接描述文件中。

在我的項目,我在我的部分之一有這樣的一個:

__FlashStart = .; 

在C程序中,我有這樣的:

extern unsigned long int _FlashStart; 
unsigned long int address = (unsigned long int)&_FlashStart; 
4

它肯定會更容易,如果你可以修改鏈接器腳本。由於您不能,因此可以從程序二進制文件中提取節名稱,地址和大小。例如,下面是如何使用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時,此答案不起作用。對不起,我試過了。

1

你能澄清你是哪個工具鏈和建築感興趣的

在我使用的是現在(IAR ARM C/C++),有內置的編譯器運營商,其返回段開始地址__sfb(...)編譯,段結束地址__sfe(...),和段大小__sfs(...)

1

你要找的符號是__text____etext__這點分別開始和.text部分的結束。

您可能會發現生成的.map文件很有用,因爲它列出了您的應用程序中定義的所有符號和部分。