Che cosa è esattamente il "programma" del mio programma con il generale? [chiuso]

-1

Ho sentito che i miei programmi C ++ "hanno bisogno di collegarsi con la libreria / runtime C ++". Tuttavia, il runtime di C ++ è solo il compilatore che inserisce codice di operazione dello stack nell'immagine, o il codice "boilerplate" se vuoi . Il runtime di C ++ è fondamentalmente intrinseco al programma stesso, quindi "collegare il runtime" è un po 'illogico. Il collegamento di una libreria ha più senso, soprattutto perché le librerie C ++ sono oggetti indipendenti che altrimenti avrebbero bisogno di essere risolti con il programma sorgente stesso, e delocalizzazione .

Quindi mi sono chiesto, oltre alla libreria C ++, cos'altro, o come sai esattamente con cosa stai collegando? Ad esempio, se dovessi collegare alla libreria C ++, dovrei anche collegarmi con la libreria e l'API specifiche del sistema operativo, o almeno un wrapper di qualche tipo che tratterà direttamente con esso.

Quindi il linker, in effetti, collegherà il file del programma principale con la libreria C ++ con l'OS-API / libreria? Non sembra particolarmente giusto.

Fondamentalmente, il linker collegherà più librerie insieme (staticamente, in questo esempio, in fase di compilazione / link-time)?

    
posta Caleb 09.12.2013 - 23:06
fonte

4 risposte

3

Su Unix e Linux, puoi vedere quali librerie sono collegate con ldd comando. L'output di un programma c ++ vuoto che ho creato come test era:

linux-gate.so.1 (0xb77ba000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb76ae000)
libm.so.6 => /usr/lib/libm.so.6 (0xb7668000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb764c000)
libc.so.6 => /usr/lib/libc.so.6 (0xb749c000)
/lib/ld-linux.so.2 (0xb77bb000)

linux-gate e ld-linux sono trattati appositamente dal linker. Il resto sono tutte librerie più o meno regolari. Sono tutti open source, quindi puoi vedere esattamente cosa fanno. Cerca "fonte libstdc ++" per esempio.

Fondamentalmente contengono implementazioni per tutto ciò che è troppo lungo per essere incorporato: contenitori di librerie standard, allocazione di memoria, trigonometria, socket, handle di file, ecc. Queste implementazioni sono altamente specifiche per l'architettura e il sistema operativo. Fanno chiamate nel kernel per il sistema operativo per il quale sono state compilate. Ho dovuto implementare diverse funzioni libc per un sistema operativo incorporato personalizzato.

    
risposta data 10.12.2013 - 02:29
fonte
2

Penso che tu abbia completamente frainteso il concetto di un libray di runtime. Il runtime è un eseguibile, fa un sacco di lavoro per allocare memoria, aprire sysout, syserr ecc. E impostare varie trappole e segnali prima viene chiamato il tuo principale.

Successivamente esegue tutto il tuo IO base tramite chiamate fopen (), fread (), ecc., gestisce qualsiasi gestione della memoria tramite "malloc ()" e molto altro ancora.

Vorrei sottolineare ancora una volta che il runtime è un eseguibile. L'implementazione varia a seconda dell'hardware e del sistema operativo coinvolti, ma di solito è una sorta di eseguibile condiviso come un "dll" di Windows che viene caricato una sola volta e condiviso da tutti i programmi c ++ nel sistema.

    
risposta data 10.12.2013 - 03:05
fonte
1

Per qualsiasi lingua compilata, la lingua specifica un ambiente di runtime su cui fai affidamento. Ad esempio in C e C ++, ci si aspetta di essere in grado di passare argomenti della riga di comando, che ci saranno output standard, errore standard e file di input standard. Ti aspetti che l'esecuzione abbia inizio al main. La libreria runtime fa tutte queste cose per te. Fa anche cose che non sono ovvie, come l'impostazione della struttura di memoria o del layout del tuo programma.

Su ciascun sistema operativo, è necessario eseguire un tweek per fornire quell'ambiente standard all'interno delle funzionalità / requisiti del particolare sistema operativo.

Quindi, ogni volta che colleghi un programma che verrà eseguito in un sistema operativo, avrai collegato la libreria run-time. A parte questo avrai a disposizione altre librerie, come la libreria standard per la tua lingua, che contiene tutte le funzioni e le classi "normali" che ti aspetti di vedere, oltre a tutte le altre librerie necessarie per utilizzare tale database ecc.

    
risposta data 10.12.2013 - 00:03
fonte
0

Ciò che viene collegato dipende da cosa c'è nel tuo programma. Tipicamente un programma sarà collegato al runtime C. Se il tuo programma C ++ utilizza STL, potresti anche ottenere il supporto per STL, a seconda delle funzioni che usi.

Non hai detto quale piattaforma stai usando. A seconda della piattaforma, è possibile utilizzare diversi strumenti per mostrare a quali librerie è collegato il programma. Il programma può anche essere collegato staticamente o dinamicamente.

    
risposta data 09.12.2013 - 23:51
fonte

Leggi altre domande sui tag