Hallo in die Runde!
Ich stehe vor einem kleinen Problem, bei dem ich mir nicht sicher bin,
ob es mit den Standard GNU Tools im Rahmen des Builds gelöst werden
kann.
Also ich habe ein Filesystem, bei welchem die Dateien über eine Struktur
in irgendeinem File global definiert werden können. Das wird über ein
Define gemacht und landet so über Pragmas und den Linker in einer
Section. Das ist schön und funktioniert so:
1 | #define ___FS_ENTRY(name, version, start, end, format_level, entry_size, wrapping, marker) const t_InodeEntry file_list_entry_##name __attribute__((section(".file_list." XSTR(name)))) = {XSTR(name), start, end};
|
2 |
|
3 | #define FS_ENTRY(name, version, start, end, format_level, entry_size, wrapping, marker) ___FS_ENTRY(name, start, end)
|
im Linker Script gibts noch:
1 | __file_list_start__ = .;
|
2 | KEEP(*(SORT(.file_list.*)))
|
3 | __file_list_end__ = .;
|
und schon kann ich im Code auf meine Liste Zugreifen. Start und End sind
dabei die Sektoren im Flash an denen die Datei beginnt und endet.
Und jetzt zur Frage gibt es irgendeine Möglichkeit im Rahmen des Build
Vorgangs zu überprüfen ob sich Dateien überschneiden? Ich weiß, ein paar
Zeilen Code im Programm, würdens auch tun, aber anders wärs mir lieber.
So wie ich das sehe, könnte ich mir für jede Datei ein Feld so groß wie
die Datei erstellen und dann dem Linker sagen, er soll das auf die
Dateistartadresse legen, in irgendeiner Section welche ich später
weglassen kann, also quasi eine virtuelle Adresse. Dann sollte mir der
Linker Überschneidungen melden. Nur ich kenne keine Möglichkeit dem
Linker beizubringen die Startadresse aus dem C Code auf eine Konstante
zu setzen.
Wie gesagt in C sind das nur ein paar Zeilen Code, aber mich würde
interessieren, ob es noch andere Tricks dafür gibt.
gr
thomas