2008-10-14 7 views
6

Wie erhalten Sie einen Zeiger auf die. Text-Speicherbereich für ein Programm aus diesem Programm? Ich brauche auch die Länge des Abschnitts, um einen "Flash to Memory" Vergleich als Teil eines kontinuierlichen Selbsttests zu machen, der im Hintergrund läuft.Wie erhalten Sie einen Zeiger auf den Abschnitt .text?

Das Toolset generiert automatisch die Linker-CMD-Datei für die Tools, die ich verwende, und das Board Support Package für das Board, das ich verwende, erfordert, dass ich die generierte .cmd-Datei verwende. (Keine make-Datei, entweder um ein Skript hinzuzufügen, um damit mit ihm zu muckeln.)

Edit: Ich arbeite mit einem TI TMS 6713 DSP mit der Code-Composer-3.1-Umgebung. Die Karte, die ich verwende, wurde von unserem Kunden beauftragt und von einer anderen Organisation produziert, so dass ich Sie nicht wirklich auf irgendwelche Informationen darauf hinweisen kann. Allerdings hängt das BSP vom "DSP BIOS" -Konfigurations-Tool von TI ab, und ich kann die Einstellungen nicht wirklich zu sehr manipulieren, ohne mich in einen außerhalb des Umfangs liegenden Aufwand zu vertiefen.

Antwort

4

Sie müssen "Variablen" in das Linker-Skript einfügen.

In einem meiner Projekte, die ich dies habe in einem meiner Sektionen:

__FlashStart = .; 

Im C-Programm Ich habe dies:

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

Es wäre auf jeden Fall einfacher, wenn Sie das ändern könnte Linker-Skript. Da dies nicht möglich ist, können Abschnittsnamen, Adressen und Größen aus der Programmbinärdatei extrahiert werden. Zum Beispiel, hier ist, wie man libbfd verwenden würde, um alle Codeabschnitte zu untersuchen.

Wenn Sie nur das .text-Segment betrachten möchten, würden Sie strcmp mit dem Abschnittsnamen vergleichen.

Der Nachteil dieses Ansatzes? Libbfd ist unter der GPL lizenziert, so dass Ihr gesamtes Projekt mit der GPL belastet wäre. Für ein kommerzielles Projekt könnte dies ein Nicht-Starter sein.

Wenn Ihre Binärdatei im ELF-Format vorliegt, können Sie stattdessen libelf verwenden. Ich bin nicht vertraut mit der Funktionsweise der Libelf-APIs, sodass ich keinen Beispielcode bereitstellen kann. Die Linux-Version ist auch GPL, aber ich glaube, dass die BSD-Projekte ihre eigene Libelf haben, die Sie verwenden könnten.

Bearbeiten: Da Sie an einem DSP in einer minimalen Echtzeit-Betriebssystemumgebung arbeiten, wird diese Antwort nicht funktionieren. Tut mir leid, ich habe es versucht.

1

Könnten Sie die Werkzeugkette und Architektur klären Sie interessiert sind.

Auf dem Compiler ich jetzt bin mit (IAR ARM C/C++) gibt es Betreiber in den Compiler gebaut, die das Segment beginnen Rücksendeadresse __sfb(...) , Segmentende-Adresse __sfe(...) und Segmentgröße __sfs(...)

1

die Symbole, die Sie suchen sind __text__ und __etext__, die auf den Beginn und das Ende des .text Schnitt.

Sie können die generierte .map Datei nützlich finden, da sie alle in Ihrer Anwendung definierten Symbole und Abschnitte auflistet.

Verwandte Themen