C ++ Nome e risoluzione dei simboli del linker

5

Gli schemi di mangling dei nomi dei compilatori C ++ variano, ma sono documentati pubblicamente. Perché i linker non sono creati per decodificare un simbolo di un oggetto e tentare di trovare una versione storpiata tramite una delle convenzioni di mangling tra gli altri file oggetto / librerie statiche? Se i linker potessero fare ciò, non contribuirebbe ad alleviare il problema con le librerie C ++ che devono essere ricompilate da ciascun compilatore per avere i simboli che possono essere risolti?

Elenco delle documentazioni di mangling che ho trovato:

posta JKor 31.12.2012 - 22:10
fonte

3 risposte

12

Il nome mangling è una parte molto piccola del problema.

Il layout degli oggetti è definito solo nello standard C ++ per un insieme di classi molto ristretto (essenzialmente solo tipi di layout standard) e quindi solo quanto lo standard C fa, l'allineamento e il padding sono ancora da considerare). Per tutto ciò che ha virtuals, qualsiasi forma di ereditarietà non banale, membri misti pubblici e privati, ecc. Lo standard non dice come dovrebbero essere disposti nella memoria.

Due compilatori possono (e questo non è puramente ipotetico, ciò accade in pratica) restituire valori diversi per sizeof(std::string) per esempio. Non c'è nulla nello standard che dice: un std::string è rappresentato in questo modo nella memoria . Quindi l'interoperabilità a livello di file oggetto non esiste.

La compatibilità binaria tra i compilatori C ++ è un problema molto più grande del semplice manomissione dei nomi. Dovresti standardizzare molto di più di quello che è attualmente specificato.

    
risposta data 31.12.2012 - 23:40
fonte
7

Lo schema di mangling dei nomi è solo una piccola parte dell'ABI. Anche le convenzioni di chiamata, il riempimento della struttura, i contenuti vtable, le dimensioni e il layout interno delle classi non POD, ecc. Variano tra i compilatori. Superare le differenze nel mangling dei nomi non aiuta, significa semplicemente silenziare una diagnostica del tempo di collegamento per una condizione (mismatch ABI) che è destinata a portare a errori di run-time silenziosi (object slicing, parametri fasulli, sovrascrittura di dati non correlati , in disaccordo su quali pezzi di un oggetto debbano essere usati per quale scopo, e molti altri).

    
risposta data 31.12.2012 - 23:40
fonte
0

Penso che la mancata corrispondenza del nome mangling sia buona come avere un nome uniforme mangling o un rilevamento automatico nome mangler / mangler potrebbe creare scompiglio collegando oggetti di diverso tipo che sarebbero altrimenti incomparabili per quanto riguarda la convenzione di chiamata, la struttura di riempimento e allineamento, e altri come menzionato nelle precedenti due domande.

Sfortunatamente, si tratta di una mancata corrispondenza tra runtime e un linker potrebbe raramente gestire questi scenari. Per fortuna, a causa della mancata corrispondenza del nome mangling, i linker possono astenersi dal collegare oggetti di ABI diversi.

    
risposta data 01.01.2013 - 19:24
fonte

Leggi altre domande sui tag