2012-07-25 5 views
5

Sto usando il compilatore gcc e il sistema operativo Ubuntu 12.04. Voglio sapere dove posso trovare il file dell'oggetto e sotto quale directory, che contiene la definizione della funzione printf. Di nuovo non sto cercando il file di intestazione che contiene il prototipo ma il file oggetto che contiene la definizione attuale.Dove posso trovare il file oggetto che contiene la definizione della funzione printf?

+1

Fa parte di 'libc'. Cosa stai cercando esattamente? Come stai cercando la definizione nel codice sorgente o nella libreria che la contiene sulla tua macchina? –

+0

Sto cercando il file oggetto sotto la libc che contiene la definizione del codice di printf. – Ananda

risposta

4

Stai cercando il file oggetto o il file sorgente?

Il file oggetto .o è archiviato in una libreria, libc.so. Nella maggior parte delle distro Linux, questo file si trova a /lib/libc.so. Su Ubuntu 11 e 12, come parte di multiarch support, il contenuto di/lib è stato spostato su /lib/i386-linux-gnu e /lib/x86_64-linux-gnu.

È possibile ottenere il file singolo oggetto utilizzando il comando ar (archivio) che è stato utilizzato per creare la libreria con l'opzione di x (estratto):

ar x libc.a stdio.o 

Questo non sembra molto utile, anche se quindi suppongo che tu voglia effettivamente il file sorgente e non il file oggetto. Per fare ciò installate lo glibc package, che contiene printf.c (che chiama vprintf, che chiama vfprintf, che contiene il codice effettivo per printf).

Questa origine può essere browsed on Launchpad. È piuttosto complicato e si estende ben oltre 2000 linee di codice.

+0

Ho 3 domande specifiche riguardo a questo esempio (1) Usando il comando ar, elenca tutti i file oggetto presenti in libC 2. Tra questi file oggetto, qual è il file che contiene la definizione della printf()? Qual è il comando che hai usato per scoprirlo? 3. È possibile ridurre la dimensione del file eseguibile finale includendo solo le definizioni effettivamente necessarie e/utilizzate nel programma? Se é cosi, come. – Ananda

+0

Sigh. Sono questi compiti? (1) man ar, (2) 'objdump + alcune opzioni | grep printf' (3) Vedi la documentazione GCC e provalo. –

0

ho trovato la risposta esatta alla prime due questioni di mine -

  1. Per elencare tutti i file oggetto presente nella libc usiamo seguenti comandi:

    sistema x86_64: $ ar -t/usr/lib/x86_64-linux-gnu/libc.a

    sistema i386: $ ar -t divertimento /usr/lib/i386-linux-gnu/libc.a

  2. Per scoprire quale oggetto di file contengono a printf ction esegui questo comando in/usr/lib/x86_64-linux-gnu/usr/lib/i386-linux-gnu o nella directory:

    $ nm -o libc.a | grep -w printf

  3. Ancora lavorando per trovare la risposta corretta.

+1

Sì, 'nm' è una buona alternativa a' objdump' quando hai a che fare con le librerie. –