Ich versuche, ein Problem zu debuggen, bei dem die falsche Version einer Funktion aufgerufen wird, was zu einem segfault führt. Der Code, den ich kompiliere, wird maschinell erzeugt und enthält eine Funktion namens 'mal', die eine komplexe Multiplikation ihrer zwei Argumente vornimmt. Dieser Code wird vor dem Verknüpfen mit einer übergeordneten Objektdatei in eine .o-Datei kompiliert.C-Programm verweist auf falsche Version der Funktion
Wenn Sie diesen Code segfolds ausführen und gdb zeigt an, dass es in der glibc-Version von 'mal' ist, die nicht einmal die gleiche Anzahl von Argumenten benötigt. Es gibt keine Instanzen von "#einschließen" irgendwo in diesem Code.
Das Ändern des Namens von Zeiten zu Zeiten1 löst das Problem. Dies ist jedoch keine langfristige Lösung, da der Code maschinell generiert wird und der Name dieser Funktion von Zeit zu Zeit unattraktiv ist.
Das ganze Chaos kompiliert Reinigung mit -Wall, also bin ich mir nicht sicher, wo ich suchen soll. Irgendwelche Ideen, wie man das löst?
Es ist nicht üblich, mehrere C-Dateien zu einem einzigen '.o' zu kompilieren. Wenn "times.c" eine von mehreren C-Dateien ist, die in dieser Gruppe kompiliert wurden, könnte dies das Problem erklären. – Gene
Ein '# include' bringt nur Deklarationen mit; Es hat keine Kontrolle über die Verknüpfung. Wenn Sie eine Funktion namens "mal" deklarieren und sie dann aufrufen, erzeugt der Compiler eine Objektdatei, die eine Referenz auf diesen Namen in seiner Symboltabelle enthält, und dann sucht der Linker nach einer Definition dieses Namens, wenn er die endgültige ausführbare Datei erzeugt . Es gibt eine 'mal'-Funktion in libc, und genau das hat der Linker gefunden. – Wyzard
Gene - Könnten Sie Ihren Kommentar näher erläutern? times.c ist in der Tat eine separate C-Datei, die in das einzelne Objekt kompiliert wird. Warum erwarten Sie, dass dies ein Problem verursacht? Es gibt wirklich nur einen Einstiegspunkt, an dem ich mich interessiere. Und 'mal' gehört nicht dazu. d.h. es sollte vollständig intern sein und nicht als dynamisches Symbol für höhere Schichten angesehen werden. Gibt es eine Möglichkeit, gcc darüber zu informieren? –