2009-07-24 12 views

risposta

5

Bene, ora che si menziona il nm di Unix, posso individuare la risoluzione del simbolo.

I file eseguibili possono fare riferimento a entità che non sono definite al loro interno. Ad esempio, variabili o procedure su librerie condivise. Quelle entità sono identificate da simboli esterni. L'eseguibile potrebbe anche avere simboli interni a cui è possibile fare riferimento da file esterni, come nel caso, ovviamente, delle librerie.

risoluzione simbolo, in questo contesto, è, una volta che un programma è stato caricato in memoria, assegnazione di indirizzi propri di ogni entità esterne si riferisce. Questo significa cambiare ogni posizione nel programma caricato dove è stato fatto un riferimento a un simbolo esterno.

Questi indirizzi dipenderanno da dove, nella memoria, è stato caricato il codice con i simboli esterni.

In Unix, la modalità di compilazione di default per i programmi è quello di utilizzare i sistemi di libreria condivisa, invece di pre-linking tutto il necessario nel file eseguibile. Quando si compila un programma con gcc, ad esempio, si passa il flag -static se si desidera che sia compilato staticamente, anziché avere riferimenti simbolici non risolti.

Cercare "librerie condivise" per ulteriori informazioni.

+0

ha un senso, vi ringrazio molto. Cercherò anche "librerie condivise". Avete dei libri che potreste raccomandare per saperne di più su questo? –

+1

Il miglior libro che conosca sull'argomento è [_Linkers and Loaders_ di John R. Levine] (http://rads.stackoverflow.com/amzn/click/1558604960). – alanc

1

Non sono sicuro di quale contesto si intenda per risoluzione di simboli. Ma mi ricorda dlopen (3) e dlsym (3) per la risoluzione dei simboli di runtime nelle librerie condivise.

+0

Intendo nel contesto di usarlo con il comando nm su unix. Questo aiuta? Non sono sicuro di quale sia il dlopen, quindi non posso dire se sei vicino. –

1

Come accennato, può riferirsi alla risoluzione dei simboli run-time o link-time. Tuttavia, non dimenticare la risoluzione simbolo in fase di compilazione.

Queste sono le regole utilizzate da una lingua per associare i simboli alle "cose". I simboli sono praticamente qualsiasi cosa che assomiglia a un nome (locale, membri e variabili globali, funzioni, metodi, tipi, ecc.) E "cose" essendo i compilatori che capiscono a cosa si riferisce il nome.

Le regole per fare ciò possono essere abbastanza semplici (ad esempio, IIRC in C è poco più di un elenco ordinato di posti da guardare) o complesso (il C++ ha tutti i tipi di sovraccarico, modelli e quant'altro). In generale, queste regole interagiscono con la semantica del programma e a volte possono addirittura provocare (potenzialmente) ambiguità:

C++:

int First(int i) { return i; } 
float First(float f) { return f; } 

void Second(int (*fn)(int)) { printf("int"); } 
void Second(float (*fn)(float); { printf("float"); } 

... 

Second(&First); // What will be printed? 
Problemi correlati