Frage

Ich bin derzeit ein Projekt mit einem paar hundert Codedateien und Abhängigkeiten auf mehrere Bibliotheken von Drittanbietern auf Mac OS zu portieren. Ich habe schließlich zu dem Punkt, wo das Programm ohne Warnungen oder Fehler kompiliert, aber es scheint nicht meine eigene Haupt-Funktion auszuführen.

Stattdessen scheint es eine andere Hauptfunktion auszuführen, die an einen Dritten zu gehören scheint. Diese Funktion schreibt einige Diagnosegerichtete Daten an die Konsole und beendet danach:

(gdb) continue
Current language:  auto; currently c++
//
// This is an automatically generated file.
// Do not edit.
//

const unsigned short expTable[] =
{
    0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 
...
    0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 
};

Debugger stopped.
Program exited with status value:0.

Ich kann den Debugger verwenden, um herauszufinden, wo diese Hauptfunktion liegt da, während der Stack-Trace gültig scheint, wird gdb mich nicht an den Namen für jeden Stapeleintrag richtige Zeilennummer und Datei zeigen (siehe this ungelöste Frage für Details).

Die Suche dauerte mehrere Minuten in Anspruch nehmen, aber ergab keine Ergebnisse.

Ihr Projekt wird mit SDL unter anderem Bibliotheken, aber ich bin Vergabe SDL_Main () und die zugrunde liegenden Probleme und habe mein Projekt auf eine völlig in Ordnung arbeitet SDL Projektvorlage gebaut. So bin ich ziemlich sicher, dass meine eigene Hauptfunktion gültig ist.

Haben Sie eine Ahnung, was falsch gehen könnte? Ich bin zur Zeit aus Ideen, wie die Schurken Hauptfunktion zu finden und zu entfernen.

Danke,

Adrian

EDIT: Wie ich gerade herausgefunden, machte ich einen Fehler, während Datei Dateien mit der Zeichenfolge suchen „Dies ist eine automatisch generierte“. Ich habe gerade ein paar Dutzend Dateien mit dem gleichen Zeichenfolge, die alle zu Freeimage, einer der Bibliotheken von Drittanbietern ich verwende. So scheint das Problem zu Freeimage verwendet zu sein, aber ich bin nicht immer noch nicht sicher, wie es weitergehen, da ich Freeimage als Bibliothek mit der beiliegenden MacOs Make-Datei erstellt habe und nur die Bibliothek enthalten. Ich werde versuchen, eine neuere Version von Freeimage neu zu erstellen und sehen, ob das mein Problem behoben.

War es hilfreich?

Lösung

Könnte es ein Initialisierer für ein statisches Objekt sein, das vor dem Haupt ausfällt () aufgerufen wird?

Andere Tipps

Haben Sie Haupt im binären mehrere haben? Versuchen Sie es mit nm darauf. (es sollte nicht möglich sein, da ld nicht mit Dubletten verknüpfen, sondern gehen in die dynamischen Bibliotheken und suchen nach _main dort)

nm a.out | grep -5 _main

Dies sollte 5 Zeilen gibt vor und nach jedem _main im binären a.out gefunden

Wenn Sie mehrere haben, finden Sie in den umliegenden Symbole für Hinweise, welche Teile sie sind in ...

Der nächste Schritt kann das gleiche auf jedem dynamischen lib zu tun sein, die verwendet wird. Um eine Liste der aktuell verfügbaren dynamischen Bibliotheken zu erhalten verwenden otool

otool -L a.out

Ich bin mir nicht sicher, wie die anderes zu finden, aber Sie können Ihren eigenen Einstiegspunkt explizit und machen die anderen nicht verwendet angeben. Sie können die GNU-Linker verwenden ld Option -e Ihren Eintrag zu setzen Punkt.

  

-er Eintrag

     

- entry = Eintrag

     

Eintrag als explizites Symbol Verwenden Sie für den Beginn der Ausführung Ihrer   Programm, anstatt der Standard-Eintrittspunkt. Wenn es keine sym-   bol genannt Eintrag, wird der Linker versucht Eintrag als eine Zahl zu analysieren,   und verwenden, die als die Eingangsadresse (die Nummer wird interpretiert   in der Basis 10; Sie können eine führende 0x für die Basis 16 oder einer führenden 0 verwenden   für Base 8).

Für zukünftige Leser, wenn Sie dieses Problem in Windows. Die äquivalente Linker-Option ist / ENTRY .

Haben Sie versucht, die ausführbare Datei durch nm läuft? Es könnte sein, können Sie einige Hinweise geben. Ich würde es nicht für möglich sei, ein Programm mit mehr als einer global sichtbaren Funktion mit dem Namen main() zu verknüpfen, nicht sicher, wie das gelingt zu geschehen.

Sehen Sie durch die Header-Dateien, die Sie enthalten und sehen, ob es nicht ein definieren ist anders, dass remaps main etwas. Dies ist ein alter Trick, um sicherzustellen, dass eine Hauptfunktion der Bibliothek wird zuerst genannt einige Set up zu tun. Im Allgemeinen wird es schließlich Ihre Hauptfunktion aufrufen, indem Sie auf den neu definierten Wert bezieht.

Eine schnelle Hack:

readelf -s -w my_bin_file > temp.txt

Öffnen temp.txt, Suche nach main (mit FUNC in einer Spalte) Gehen Sie, bis Sie auf die erste Datei Spalte finden -. Dies ist die Datei mit der verknüpften Haupt

Bearbeiten Dies funktioniert nur auf GNU Unix-Varianten und Freunden. OS X verwendet das Mach-O-Format, nicht ELF.

Ich weiß, dass in C, Sie einen anderen Einstiegspunkt vor der Hauptfunktion aufgerufen haben, die eine Idee sein könnte. Der Code in der Regel wie folgt aussieht:

void __attribute__ ((constructor)) my_main(void);

Vielleicht kann man für so etwas in Ihrem Code suchen.

In C gibt es auch andere Möglichkeiten, um die Hauptfunktion zu fangen und es nach dem „echten“ Haupt nennen. Einige Themen Bibliotheken haben diese Art von Hacks, um „vorbereiten“, um die environnement, Planer und solche Sachen.

Das ist nicht wirklich nützlich ist, aber dies könnte erklären, warum Ihre Haupt nicht aufgerufen wird.

Hope, das hilft!

Noch ein Hinweis.

WxWidgets haben auch ihre eigenen main definieren

hier

  

Wie bei allen Programmen muss eine „main“ Funktion. Unter WxWidgets Haupt wird mit dieser Makro implementiert, die eine Anwendungsinstanz erstellt und startet das Programm.

     

IMPLEMENT_APP(MyApp)

Es sieht aus wie Sie eine Datei namens b44ExpLogTable.cpp Ihre binäre oder eine in thirdpart Bibliothek zusammengestellt haben. Es sieht aus wie das kleine Programm ist eine exp () Tabelle zu erzeugen, hat aber irgendwie kam in Ihr Projekt importiert werden (s)

Siehe diese und dies in Freeimage Quellen

Generieren Sie eine Map-Datei. Die meisten Programme eigentlich nicht zu Haupt starten. Ein mapfile von GCC sollten Sie die Adresse __start oder __executable_start erzählen, die Sie sollten in der Lage sein, brechen in und Schritt für Schritt durch, um zu sehen, was Ihr Programm verursacht zu beenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top