2012-10-09 7 views
5

Sto leggendo il libro O'Reilly 21st Century C in cui l'autore afferma che quando si collega una libreria statica "il compilatore [copia efficacemente i contenuti rilevanti della libreria nell'eseguibile finale".Come viene copiato il codice oggetto nell'eseguibile quando si collega alla libreria statica?

ho cercato di testare questo con la creazione di mia libreria statica che consiste di questo modulo:

static char szStr[64]; 

char* single_func() { 
    strcpy(szStr, "Hello string!\r\n"); 
    return szStr; 
} 

void func0() { 
    strcpy(szStr, "Hello"); 
} 

char* func1() { 
    strcat(szStr, " string!\r\n"); 
    return szStr; 
} 

Per testare un creato per i file C dove si sta chiamando single_func() e le altre chiamate func0() e FUNC1().

Gli eseguibili risultanti sono 751290B in entrambi i casi. Se chiamo strcpy e strcat direttamente dai moduli entrambi gli eseguibili finiscono per essere 7215B.

Questo è in conflitto con la dichiarazione di cui sopra o mi manca qualche dettaglio sul collegamento?

Una questione collegata è che la libreria statica è 1600B Perché allora questa aumento delle dimensioni viene?


aggiuntive:

Entrambi i file principali sono costituiti da niente più che chiamare le funzioni e la stampa dei risultati, come questo:

Main0:

#include <stdio.h> 
#include "sharedlib.h" 
int main() { 
    char* szStr = single_func(); 
    printf("%s", szStr); 
    return 0; 
} 

Principale1:

#include <stdio.h> 
#include "sharedlib.h" 
int main() { 
    char* szStr; 
    func0(); 
    szStr = func1(); 
    printf("%s", szStr); 
    return 0; 
} 

file sono stati compilati in questo modo:

gcc -static main0.c -L. -lsharedlib -o main0 

piattaforma è Linux e il compilatore gcc è v4.6.3.

risposta

3

Con le librerie statiche, l'unità di copia è il file oggetto nella libreria. Poiché entrambi i programmi chiamano una funzione dal file oggetto, entrambi i programmi finiscono con tutto il file oggetto nell'eseguibile, quindi lo stesso risultato di dimensione (dà o prende la dimensione del programma di chiamata main()).

Le informazioni aggiuntive nell'eseguibile potrebbero provenire da diversi punti. Alcuni di essi saranno controllo e informazioni di debug. Alcuni potrebbero provenire dalla libreria C se lo si è collegato anche in modo statico. Probabilmente dovremmo vedere il programma principale e le linee di collegamento e conoscere la piattaforma per trovare altre ragioni per l'inflazione.

+1

Ho aggiornato la mia domanda con le informazioni aggiuntive che hai richiesto, ma penso di poter iniziare a vedere dove sta andando. 1: quando si utilizza una singola funzione dal file oggetto di una libreria, l'intero file oggetto viene inserito nell'eseguibile. 2: usando l'opzione -static _all_ le librerie vengono lanciate nell'eseguibile finale, producendo la dimensione del file più grande. Sono corretto in questo? – Kenneth

+1

Sì; hai ragione in entrambi i particolari. Se guardate il libro di Plauger "The Standard C Library" (per lo standard C89), vedreste che la maggior parte dei file sorgente ha una funzione visibile esternamente in modo da non trascinare ciò che non usate nell'eseguibile. Probabilmente potresti ridurre drasticamente la dimensione del tuo eseguibile aggiungendo '-shared' alla riga di comando dopo' -lsharedlib'. –

+0

Sono un po 'sorpreso dal fatto che la libreria C sia stata (sembra essere) collegata staticamente. Un tempo (forse un decennio fa) pensavo che la libreria C non fosse fornita come libreria statica (quindi doveva essere condivisa).Potrei essere in errore, o potrebbe essere stato su una variante di Unix piuttosto che su Linux. È possibile controllare cosa viene caricato come libreria condivisa con 'ldd main0'. Elencherà gli oggetti condivisi usati. –

Problemi correlati