Bonsoir,
Quelqu’un pourrait-il m’indiquer comment obtenir le code source de la fonction printf.
merci
Bonsoir,
Quelqu’un pourrait-il m’indiquer comment obtenir le code source de la fonction printf.
merci
C’est une fonction de base de C, elle est donc dans les sources de gcc (libstdc je pense)
Ben, ça devrait être dans le code de la libc (sous linux, en tout cas), non ? Et la libc fait partie du projet GNU, si je ne dis pas de bêtise…
Deux secondes de recherche sous 10^100 donnent : ftp.gnu.org/gnu/glibc/glibc-2.13.tar.xz pour le code source)
j’ai téléchargé le fichier glibc-2.13.tar.xz mais je ne parviens pas à le décompresser.
Quelle est la commande ? j’ai essayé tar xvf nomdufichier mais ça ne marche pas
Pour décompresser :
xz --decompress glibc-2.13.tar.xz
Pour “dé-tarer”
tar -xvf glibc-2.13.tar
Dans les sources de gcc, tu trouves
[quote] int
printf VPARAMS ((const char *format, …))
{
int result;
VA_OPEN (ap, format);
VA_FIXEDARG (ap, const char *, format);
result = vfprintf (stdout, format, ap);
VA_CLOSE (ap);
return result;
}
[/quote]
Après il faut chercher vfprintf, mais là ça se complique. Tu as sans doute une redédifinition de printf dans la libc6 ou mieux, la dietlibc plus petite.
[code]#include <stdarg.h>
#include <unistd.h>
#include “dietstdio.h”
int __stdio_outs(const char *s,size_t len) attribute((weak));
int __stdio_outs(const char *s,size_t len) {
return (write(1,s,len)==(ssize_t)len)?1:0;
}
int vprintf(const char format, va_list ap)
{
struct arg_printf _ap = { 0, (int()(void*,size_t,void*)) __stdio_outs };
return __v_printf(&_ap,format,ap);
}
[/code]
puis enfin
[code]int __v_printf(struct arg_printf* fn, const char *format, va_list arg_ptr)
{
unsigned int len=0;
#ifdef WANT_ERROR_PRINTF
int _errno = errno;
#endif
while (*format) {
unsigned long sz = skip_to(format);
if (sz) {
B_WRITE(fn,format,sz); len+=sz;
format+=sz;
}
if (format==’%’) {
char buf[128];
union { chars; } u_str;
#define s u_str.s
int retval;
unsigned char ch, padwith=' ', precpadwith=' ';
char flag_in_sign=0;
char flag_upcase=0;
char flag_hash=0;
char flag_left=0;
char flag_space=0;
char flag_sign=0;
char flag_dot=0;
signed char flag_long=0;
unsigned int base;
[…]
[/code]Bref, tu peux charger les sources que tu veux, prends les sources dietlibc-dev par exemple.
(apt-get source dietlibc-dev)
Pour ta question: xz -d fichier.tar.xz puis tar xf fichier.tar ou tar xJf fichier.tar.xz)
[quote=“mont”]Ben, ça devrait être dans le code de la libc (sous linux, en tout cas), non ? Et la libc fait partie du projet GNU, si je ne dis pas de bêtise…
Deux secondes de recherche sous 10^100 donnent : ftp.gnu.org/gnu/glibc/glibc-2.13.tar.xz pour le code source) [/quote]
C’est le cas de la glibc, mais il y en a d’autres comme bionic de Google.
[quote=“M3t4linux”]Pour décompresser :
xz --decompress glibc-2.13.tar.xz
Pour “dé-tarer”
tar -xvf glibc-2.13.tar[/quote]
ou tar xvJf glibc-2.13.tar.xz
je n’ai pas la commande xz et je n’ai pas trouvé le paquet à installer pour obtenir cette commande.
je précise que j’utilise debian lenny
tar xvJf glibc-2.13.tar.xz ne marche pas non plus
tar : l’option « – J » n’est pas valable
C’est le paquet xz-utils
même problème avec la commande :
tar xjf glibc-2.13.tar.xz
bzip2: (stdin) is not a bzip2 file.
tar: Child returned status 2
tar: Des erreurs ont provoqué l’arrêt du programme
je n’ai pas réussi à installé le paquet xz-utils (non trouvé)
quel dépôt faut-il ?
voici mes dépôts :
deb ftp.fr.debian.org/debian/ lenny main
deb-src ftp.fr.debian.org/debian/ lenny main
deb security.debian.org/ lenny/updates main
deb-src security.debian.org/ lenny/updates main
deb volatile.debian.org/debian-volatile lenny/volatile main
deb-src volatile.debian.org/debian-volatile lenny/volatile main
Oh, come on, man…
Si t’arrives pas à extraire le xz (ce qui est possible, ’serait temps de passer à Squeeze, peut-être !), récupère la version gz ou bz2 (ftp.gnu.org/gnu/glibc/glibc-2.13.tar.bz2)
tar xJf et non xjf, c’est un j majuscule.
apt-get source libc6-dev
ou bien
apt-get source dietlibc-dev
Tu te compliques la vie.
j’ai finalement opté pour la solution la plus simple :
apt-get source libc6-dev
par contre je suis allé dans /usr/src et je n’ai pas trouvé les sources …
apt-get source libc-dev te crée un répertoire glibc-??? contenant les sources (déplié en général) de la libc6. Tu trouveras un xz statique ici: http://boisson.homeip.net/debian/xz
Quand je télécharge des sources avec apt-get source, ces sources se mettent dans le répertoire où tu te trouves, pas /usr/src/.