Domanda

Attualmente sto trasferendo un progetto con poche centinaia di file di codice e dipendenze su diverse librerie di terze parti su Mac Os. Sono finalmente arrivato al punto in cui il programma viene compilato senza avvisi o errori, ma non sembra eseguire la mia funzione principale.

Invece sembra eseguire qualche altra funzione principale che sembra appartenere a una terza parte. Questa funzione scrive alcuni dati di aspetto diagnostico sulla console ed esce successivamente:

(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.

Non posso usare il debugger per scoprire dove risiede questa funzione principale perché, mentre la traccia dello stack sembra valida, gdb non mi mostra il numero di riga e il nome file corretti per ogni voce dello stack (Vedi questa domanda irrisolta per dettagli).

Il completamento della ricerca ha richiesto diversi minuti, ma non ha prodotto risultati.

Il mio progetto sta usando SDL tra le altre librerie, ma sono stato premiato con SDL_Main () e con i problemi sottostanti e ho costruito il mio progetto su un modello di progetto SDL perfettamente funzionante. Quindi sono abbastanza sicuro che la mia funzione principale sia valida.

Hai idea di cosa potrebbe andare storto? Al momento non ho idee su come trovare e rimuovere la funzione principale canaglia.

Grazie,

Adrian

EDIT: Come ho appena scoperto, ho fatto un errore durante la ricerca di file con la stringa " Questo è un " generato automaticamente. Ho appena trovato diverse dozzine di file con la stessa stringa, tutte appartenenti a FreeImage, una delle librerie di terze parti che sto usando. Quindi, il problema sembra essere correlato a FreeImage, ma non sono ancora sicuro di come procedere poiché ho compilato Freeimage come libreria con il makefile di MacO incluso e ho incluso solo la libreria. Proverò a ricostruire una versione più recente di FreeImage e vedrò se ciò ha risolto il mio problema.

È stato utile?

Soluzione

Potrebbe essere un inizializzatore per un oggetto statico che fallisce prima che venga chiamato main ()?

Altri suggerimenti

Hai diversi main nel binario? Prova a usare nm su di esso. (non dovrebbe essere possibile perché ld non si collegherà ai duplicati, ma vai nelle librerie dinamiche e cerca _main lì)

nm a.out | grep -5 _main

Questo dovrebbe dare 5 righe prima e dopo qualsiasi _main trovato nel a.out

binario

Se ne hai diversi, vedi i simboli circostanti per suggerimenti su quali parti si trovano ...

Il prossimo passo può essere quello di fare lo stesso su ogni libreria dinamica utilizzata. Per ottenere un elenco delle librerie dinamiche utilizzate, utilizzare otool

otool -L a.out

Non sono sicuro di come trovare l'altro, ma puoi specificare il tuo punto di ingresso in modo esplicito e rendere l'altro inutilizzato. Puoi usare il linker GNU ld -e per impostare la tua voce punto.

  

-e voce

     

- ingresso = entry

     

Usa la voce come simbolo esplicito per iniziare l'esecuzione del tuo   programma, piuttosto che il punto di ingresso predefinito. Se non ci sono simboli   bol nome della voce, il linker proverà ad analizzare la voce come un numero,   e usalo come indirizzo di ingresso (il numero verrà interpretato   nella base 10; è possibile utilizzare uno 0x iniziale per la base 16 o uno 0 iniziale   per base 8).

Per i lettori futuri, se hai questo problema in Windows. L'opzione linker equivalente è / ENTRY .

Hai provato a eseguire il tuo eseguibile tramite nm ? Potrebbe essere in grado di darti alcuni suggerimenti. Non penso che sarebbe possibile collegare un programma con più di una funzione visibile globalmente chiamata main () , non sono sicuro di come ciò accada.

Cerca tra i file di intestazione che includi e vedi se non esiste una definizione che rimappa main in qualcos'altro. Questo è un vecchio trucco per garantire che la funzione principale di una libreria venga chiamata per prima per eseguire alcune impostazioni. In generale, alla fine chiamerà la tua funzione principale facendo riferimento al valore ridefinito.

Un trucco rapido:

readelf -s -w my_bin_file > temp.txt

Apri temp.txt, cerca main (con FUNC in una colonna) Vai su fino a trovare la prima colonna FILE: questo è il file con il principale collegato.

modifica: funziona solo con i gusti e gli amici di GNU Unix. OS X utilizza il formato Mach-O, non ELF.

So che in C, puoi avere un diverso punto di accesso chiamato prima della funzione principale, che potrebbe essere un'idea. Il codice di solito appare come:

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

Forse puoi cercare qualcosa del genere nel tuo codice.

In C, ci sono anche diversi modi per catturare la funzione principale e chiamarla dopo il "reale" principale. Alcune librerie di thread hanno questo tipo di hack per "preparare" l'ambiente, lo schedulatore e cose del genere.

Questo non è davvero utile, ma ciò può spiegare perché il tuo main non viene chiamato affatto.

Spero che questo aiuti!

Un'altra nota.

WxWidgets definisce anche il proprio main

Da qui

  

Come in tutti i programmi, ci deve essere un " main " funzione. In wxWidgets main viene implementato usando questa macro, che crea un'istanza dell'applicazione e avvia il programma.

     

IMPLEMENT_APP (MiaApp)

Sembra che tu possa avere un file chiamato b44ExpLogTable.cpp compilato nel tuo binario o in qualche libreria di terze parti. Sembra che quel piccolo programma sia quello di generare una tabella exp () ma in qualche modo è stato importato nei tuoi progetti

Vedi questo e questo in Fonti di FreeImage

Genera un file di mappa. La maggior parte dei programmi in realtà non si avvia principalmente. Un file di mappe di GCC dovrebbe indicare l'indirizzo di __start o __executable_start, che dovresti essere in grado di entrare e vedere per scoprire cosa sta causando la chiusura del tuo programma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top