Lösen Sie das Problem der Teilung und des Fehlers bei der Kompilierung eingebetteter Arme: __umodsi3 und __udivsi3

Vorwort

Bei der Überprüfung des SOC-Prototyps ist beim Kompilieren des Programms das Problem aufgetreten, dass die Division nicht unterstützt wird. Im Internet gibt es keine praktische Lösung. Ich habe sed replacement verwendet, um eine bessere Methode zu implementieren.
Der Artikel wird in der Reihenfolge erfasst, in der Probleme aufgetreten sind.

Problem 1: Division wird nicht unterstützt

Die Bedeutung dieses Problems ist relativ einfach und wird im Internet sehr klar erklärt. ARM ist ein reduzierter Befehlssatz. Es unterstützt keine Division und muss zur Implementierung Bibliothekssoftware von Drittanbietern aufrufen. Die lgcc- Bibliothek wird hier aufgerufen und hinzugefügt, wenn eine Verbindung erforderlich ist, wie in der folgenden Abbildung dargestellt.

Hier folgt auf -l der Bibliotheksname gcc.
Sie können auf der offiziellen gcc-Website eine Version mit derselben Architektur zum Herunterladen finden. Sie können auch in Ihrer eigenen Kompilierungsumgebung danach suchen. Manchmal ist sie in anderen > Verzeichnissen versteckt und kopiere es einfach.

Fügen Sie hier eine Bildbeschreibung ein

Problem 2: Bl-Jump-Problem

Nach dem Hinzufügen der oben genannten Bibliothek besteht immer noch ein Problem. Hinweis

Verschiebung passend gekürzt:

Dies kann in der kompilierten Assembly-Datei angezeigt werden. Sie können sehen, dass die bl-Anweisung zum Aufrufen von __umodsi3 und __udivsi3 in der Assembly-Datei verwendet wird. Der Sprungbereich der bl-Anweisung ist sehr klein. Hier müssen Sie die LDR-Anweisung verwenden, anstatt zu springen.

Vor dem Austausch: bl __umodsi3
Nach dem Austausch: ldr pc, =__umodsi3

Dies kann mit dem Befehl sed zur Stapelersetzung erfolgen.

sed -i 's/bl\s__umodsi3/ldr\tpc, =__umodsi3/' 汇编文件名
sed -i 's/bl\s__udivsi3/ldr\tpc, =__udivsi3/' 汇编文件名

Frage 3: Kein Speicherbereich angegeben für

Nachdem Sie die einzelne Datei oben geändert haben, kann sie kompiliert werden. Dieses Problem hängt mit meinem Link-Skript zusammen. Es sollte nichts mit der Kompilierungsteilung zu tun haben.
Wenn Sie mehrere Dateien kompilieren, verwenden Sie include, um andere C-Dateien einzuschließen. Dann kompilieren. Melden Sie einen Fehler

Es wurde kein Speicherbereich angegeben

Dies ist in das Link-Skript integriert, da in der kompilierten .o-Datei kein Platz für das Textfeld festgelegt ist.
Mein Link-Skript einfügen:
Fügen Sie hier eine Bildbeschreibung ein
Ähnliche Probleme sollten eine gemeinsame Lösung haben: Sie können die fehlenden Felder zum Link-Skript hinzufügen, um Platz zu reservieren.
Sie können * verwenden, um mehrere Dateien abzugleichen.

Verweise

  1. Undefinierter Verweis auf __modsi3 #267
  2. Die falsche Verwendung von bl-Jump-Anweisungen führt zu Kompilierungsfehlern – Verschiebung gekürzt, um zu passen: R_ARM_PC24 init_irq
  3. Zusammenfassung der ARM-FAQs
  4. Zusammenfassung der Methoden zum Suchen und Ersetzen von Zeichenfolgen in Dateien mit dem Befehl sed
  5. Shell verwendet sed, um Text zu ersetzen
  6. Problem mit der GCC-T-Linkoption
  7. Verknüpfungsfehler bei Verwendung von sprintf()
  8. Linker-Skript – RAM und ROM gleicher Speicherplatz

Guess you like

Origin blog.csdn.net/weixin_44681954/article/details/122156557