Je pense que cette page résume bien le sujet :
http://www-clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node113.html
Je précise que je suis partisan des "refs et des defs" et non de la
méthode dite du "common", avec une seule def et la ref dans un fichier
d'include.
Je pense que cette page résume bien le sujet :
http://www-clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node113.html
Je précise que je suis partisan des "refs et des defs" et non de la
méthode dite du "common", avec une seule def et la ref dans un fichier
d'include.
Je pense que cette page résume bien le sujet :
http://www-clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node113.html
Je précise que je suis partisan des "refs et des defs" et non de la
méthode dite du "common", avec une seule def et la ref dans un fichier
d'include.
Pour l'instant, j'ai tendance à croire que déclarer un identifiant, ça
revient à dire au compilateur « ceci est l'indentifiant d'un objet de
tel type, ne gueule pas si tu me vois utiliser cet identifiant
conformément à ce type » alors que la définition, c'est ce qui fait que
le compilateur va effectivement réserver un place en mémoire pour
l'objet. Suis-je à côté de la plaque sur ce point ?
Non, tu es très proche de ce qu'en dit le K&R (c'est quand-même moins
velu que la norme) :
"une définition crée une variable, et lui réserve de la place mémoire;
une déclaration précise la nature d'une variable, mais sans lui réserver
de place en mémoire".
Par contre, niveau syntaxique, j'ai beaucoup de mal à voir ce qui
différencie les deux. J'ai l'impression qu'une déclaration qui comporte
aussi une initialisation est de fait une définition.
Impression justifiée.
Pour le reste,
visiblement le compilateur ne se décide pas au moment où il lit la
déclaration pour savoir si c'est aussi une définition : il attend la fin
de l'unité de compilation (le fichier ?)
L'unité de compilation est le résultat du fichier source et des en-têtes
qui y sont inclus. Au final, oui, il n'y a qu'un fichier aux yeux du
compilo, puisque tout cela est fait par le préprocesseur.
S'il y a un exercice difficile en C, c'est bien d'interpréter la
norme... quand on débute, il est peut-être plus judicieux d'avoir une
bonne référence qui vulgarise. Le K&R est très bien pour ça (mais
strictement, il ne vulgarise pas la norme, il la précède).
Pour l'instant, j'ai tendance à croire que déclarer un identifiant, ça
revient à dire au compilateur « ceci est l'indentifiant d'un objet de
tel type, ne gueule pas si tu me vois utiliser cet identifiant
conformément à ce type » alors que la définition, c'est ce qui fait que
le compilateur va effectivement réserver un place en mémoire pour
l'objet. Suis-je à côté de la plaque sur ce point ?
Non, tu es très proche de ce qu'en dit le K&R (c'est quand-même moins
velu que la norme) :
"une définition crée une variable, et lui réserve de la place mémoire;
une déclaration précise la nature d'une variable, mais sans lui réserver
de place en mémoire".
Par contre, niveau syntaxique, j'ai beaucoup de mal à voir ce qui
différencie les deux. J'ai l'impression qu'une déclaration qui comporte
aussi une initialisation est de fait une définition.
Impression justifiée.
Pour le reste,
visiblement le compilateur ne se décide pas au moment où il lit la
déclaration pour savoir si c'est aussi une définition : il attend la fin
de l'unité de compilation (le fichier ?)
L'unité de compilation est le résultat du fichier source et des en-têtes
qui y sont inclus. Au final, oui, il n'y a qu'un fichier aux yeux du
compilo, puisque tout cela est fait par le préprocesseur.
S'il y a un exercice difficile en C, c'est bien d'interpréter la
norme... quand on débute, il est peut-être plus judicieux d'avoir une
bonne référence qui vulgarise. Le K&R est très bien pour ça (mais
strictement, il ne vulgarise pas la norme, il la précède).
Pour l'instant, j'ai tendance à croire que déclarer un identifiant, ça
revient à dire au compilateur « ceci est l'indentifiant d'un objet de
tel type, ne gueule pas si tu me vois utiliser cet identifiant
conformément à ce type » alors que la définition, c'est ce qui fait que
le compilateur va effectivement réserver un place en mémoire pour
l'objet. Suis-je à côté de la plaque sur ce point ?
Non, tu es très proche de ce qu'en dit le K&R (c'est quand-même moins
velu que la norme) :
"une définition crée une variable, et lui réserve de la place mémoire;
une déclaration précise la nature d'une variable, mais sans lui réserver
de place en mémoire".
Par contre, niveau syntaxique, j'ai beaucoup de mal à voir ce qui
différencie les deux. J'ai l'impression qu'une déclaration qui comporte
aussi une initialisation est de fait une définition.
Impression justifiée.
Pour le reste,
visiblement le compilateur ne se décide pas au moment où il lit la
déclaration pour savoir si c'est aussi une définition : il attend la fin
de l'unité de compilation (le fichier ?)
L'unité de compilation est le résultat du fichier source et des en-têtes
qui y sont inclus. Au final, oui, il n'y a qu'un fichier aux yeux du
compilo, puisque tout cela est fait par le préprocesseur.
S'il y a un exercice difficile en C, c'est bien d'interpréter la
norme... quand on débute, il est peut-être plus judicieux d'avoir une
bonne référence qui vulgarise. Le K&R est très bien pour ça (mais
strictement, il ne vulgarise pas la norme, il la précède).
Le 27/04/2009 2:30, Vincent Lefevre écrivit :
> Donc tu peux très bien mettre plusieurs "int x;" sans extern, ce
> qui aurait été impossible si c'était une définition (puisqu'il ne
> peut y avoir qu'au plus une définition).
À la condition expresse que cela se passe dans la même unité de
compilation ! Si tu as des tentatives dans deux unités distinctes, cela
devrait être interprété comme deux déclarations externes, et peut donner
des erreurs à l'éditions des liens (techniquement le comportement est
indéfini, viol de /shall/ dans 6.9p5).
Donc à moins que le linker version machin ne sache pas lire correctement
le Mach-o fourni par le compilateur (ce qui semblerait surprenant), le
défaut réel est que le compilateur génère une définition (probablement
un common, plus précisement un .undef de taille non nulle) qui n'est
pas^W plus conforme à ce qu'attend cette version-là de ld ; autrement
dit, la solution correcte du point de vue de la norme devrait être de
modifier le compilateur pour ne plus générer de variables
communautarisées... (évidemment, d'un point de vue plus général de
qualité de l'implémentation, cela ne sera pas résolu de cette façon,
c'est ld qui va plier devant GCC + la quantité de code qui assume de
facto le modèle Unix.)
Le 27/04/2009 2:30, Vincent Lefevre écrivit :
> Donc tu peux très bien mettre plusieurs "int x;" sans extern, ce
> qui aurait été impossible si c'était une définition (puisqu'il ne
> peut y avoir qu'au plus une définition).
À la condition expresse que cela se passe dans la même unité de
compilation ! Si tu as des tentatives dans deux unités distinctes, cela
devrait être interprété comme deux déclarations externes, et peut donner
des erreurs à l'éditions des liens (techniquement le comportement est
indéfini, viol de /shall/ dans 6.9p5).
Donc à moins que le linker version machin ne sache pas lire correctement
le Mach-o fourni par le compilateur (ce qui semblerait surprenant), le
défaut réel est que le compilateur génère une définition (probablement
un common, plus précisement un .undef de taille non nulle) qui n'est
pas^W plus conforme à ce qu'attend cette version-là de ld ; autrement
dit, la solution correcte du point de vue de la norme devrait être de
modifier le compilateur pour ne plus générer de variables
communautarisées... (évidemment, d'un point de vue plus général de
qualité de l'implémentation, cela ne sera pas résolu de cette façon,
c'est ld qui va plier devant GCC + la quantité de code qui assume de
facto le modèle Unix.)
Le 27/04/2009 2:30, Vincent Lefevre écrivit :
> Donc tu peux très bien mettre plusieurs "int x;" sans extern, ce
> qui aurait été impossible si c'était une définition (puisqu'il ne
> peut y avoir qu'au plus une définition).
À la condition expresse que cela se passe dans la même unité de
compilation ! Si tu as des tentatives dans deux unités distinctes, cela
devrait être interprété comme deux déclarations externes, et peut donner
des erreurs à l'éditions des liens (techniquement le comportement est
indéfini, viol de /shall/ dans 6.9p5).
Donc à moins que le linker version machin ne sache pas lire correctement
le Mach-o fourni par le compilateur (ce qui semblerait surprenant), le
défaut réel est que le compilateur génère une définition (probablement
un common, plus précisement un .undef de taille non nulle) qui n'est
pas^W plus conforme à ce qu'attend cette version-là de ld ; autrement
dit, la solution correcte du point de vue de la norme devrait être de
modifier le compilateur pour ne plus générer de variables
communautarisées... (évidemment, d'un point de vue plus général de
qualité de l'implémentation, cela ne sera pas résolu de cette façon,
c'est ld qui va plier devant GCC + la quantité de code qui assume de
facto le modèle Unix.)
Je pense que cette page résume bien le sujet :
http://www-clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node113.html
Je pense que cette page résume bien le sujet :
http://www-clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node113.html
Je pense que cette page résume bien le sujet :
http://www-clips.imag.fr/commun/bernard.cassagne/Introduction_ANSI_C/node113.html
Alexandre Bacquart scripsit:Pour l'instant, j'ai tendance à croire que déclarer un identifiant, ça
revient à dire au compilateur « ceci est l'indentifiant d'un objet de
tel type, ne gueule pas si tu me vois utiliser cet identifiant
conformément à ce type » alors que la définition, c'est ce qui fait que
le compilateur va effectivement réserver un place en mémoire pour
l'objet. Suis-je à côté de la plaque sur ce point ?
Non, tu es très proche de ce qu'en dit le K&R (c'est quand-même moins
velu que la norme) :
"une définition crée une variable, et lui réserve de la place mémoire;
une déclaration précise la nature d'une variable, mais sans lui réserver
de place en mémoire".
Bonne nouvelle.Par contre, niveau syntaxique, j'ai beaucoup de mal à voir ce qui
différencie les deux. J'ai l'impression qu'une déclaration qui comporte
aussi une initialisation est de fait une définition.
Impression justifiée.
Ok.Pour le reste,
visiblement le compilateur ne se décide pas au moment où il lit la
déclaration pour savoir si c'est aussi une définition : il attend la fin
de l'unité de compilation (le fichier ?)
L'unité de compilation est le résultat du fichier source et des en-têtes
qui y sont inclus. Au final, oui, il n'y a qu'un fichier aux yeux du
compilo, puisque tout cela est fait par le préprocesseur.
Ok.S'il y a un exercice difficile en C, c'est bien d'interpréter la
norme... quand on débute, il est peut-être plus judicieux d'avoir une
bonne référence qui vulgarise. Le K&R est très bien pour ça (mais
strictement, il ne vulgarise pas la norme, il la précède).
A priori, j'étais parti sur l'idée de lire linéairement le
Braquelaire, dont je suis pour l'instant très content, mais
effectivement je devrais consulter un peu plus le K&R (d'autant plus que
je l'ai sous la main).
Je ne sais pas si tout est clair pour moi, il faudra que je réfléchisse
encore un peu là-dessus, je reviendrai à la charge avec d'autres
questions au besoin.
En attendant, je pense que ça me ferait du bien de mieux comprendre le
processus de compilation : ce qu'est un fichier objet,
comme se passe
l'édition de liens (statique ou dynamique), etc.
Si vous avez des bonnes
lectures (mais pas trop longues) à me conseiller à ce sujet, je suis
preneur.
Alexandre Bacquart scripsit:
Pour l'instant, j'ai tendance à croire que déclarer un identifiant, ça
revient à dire au compilateur « ceci est l'indentifiant d'un objet de
tel type, ne gueule pas si tu me vois utiliser cet identifiant
conformément à ce type » alors que la définition, c'est ce qui fait que
le compilateur va effectivement réserver un place en mémoire pour
l'objet. Suis-je à côté de la plaque sur ce point ?
Non, tu es très proche de ce qu'en dit le K&R (c'est quand-même moins
velu que la norme) :
"une définition crée une variable, et lui réserve de la place mémoire;
une déclaration précise la nature d'une variable, mais sans lui réserver
de place en mémoire".
Bonne nouvelle.
Par contre, niveau syntaxique, j'ai beaucoup de mal à voir ce qui
différencie les deux. J'ai l'impression qu'une déclaration qui comporte
aussi une initialisation est de fait une définition.
Impression justifiée.
Ok.
Pour le reste,
visiblement le compilateur ne se décide pas au moment où il lit la
déclaration pour savoir si c'est aussi une définition : il attend la fin
de l'unité de compilation (le fichier ?)
L'unité de compilation est le résultat du fichier source et des en-têtes
qui y sont inclus. Au final, oui, il n'y a qu'un fichier aux yeux du
compilo, puisque tout cela est fait par le préprocesseur.
Ok.
S'il y a un exercice difficile en C, c'est bien d'interpréter la
norme... quand on débute, il est peut-être plus judicieux d'avoir une
bonne référence qui vulgarise. Le K&R est très bien pour ça (mais
strictement, il ne vulgarise pas la norme, il la précède).
A priori, j'étais parti sur l'idée de lire linéairement le
Braquelaire, dont je suis pour l'instant très content, mais
effectivement je devrais consulter un peu plus le K&R (d'autant plus que
je l'ai sous la main).
Je ne sais pas si tout est clair pour moi, il faudra que je réfléchisse
encore un peu là-dessus, je reviendrai à la charge avec d'autres
questions au besoin.
En attendant, je pense que ça me ferait du bien de mieux comprendre le
processus de compilation : ce qu'est un fichier objet,
comme se passe
l'édition de liens (statique ou dynamique), etc.
Si vous avez des bonnes
lectures (mais pas trop longues) à me conseiller à ce sujet, je suis
preneur.
Alexandre Bacquart scripsit:Pour l'instant, j'ai tendance à croire que déclarer un identifiant, ça
revient à dire au compilateur « ceci est l'indentifiant d'un objet de
tel type, ne gueule pas si tu me vois utiliser cet identifiant
conformément à ce type » alors que la définition, c'est ce qui fait que
le compilateur va effectivement réserver un place en mémoire pour
l'objet. Suis-je à côté de la plaque sur ce point ?
Non, tu es très proche de ce qu'en dit le K&R (c'est quand-même moins
velu que la norme) :
"une définition crée une variable, et lui réserve de la place mémoire;
une déclaration précise la nature d'une variable, mais sans lui réserver
de place en mémoire".
Bonne nouvelle.Par contre, niveau syntaxique, j'ai beaucoup de mal à voir ce qui
différencie les deux. J'ai l'impression qu'une déclaration qui comporte
aussi une initialisation est de fait une définition.
Impression justifiée.
Ok.Pour le reste,
visiblement le compilateur ne se décide pas au moment où il lit la
déclaration pour savoir si c'est aussi une définition : il attend la fin
de l'unité de compilation (le fichier ?)
L'unité de compilation est le résultat du fichier source et des en-têtes
qui y sont inclus. Au final, oui, il n'y a qu'un fichier aux yeux du
compilo, puisque tout cela est fait par le préprocesseur.
Ok.S'il y a un exercice difficile en C, c'est bien d'interpréter la
norme... quand on débute, il est peut-être plus judicieux d'avoir une
bonne référence qui vulgarise. Le K&R est très bien pour ça (mais
strictement, il ne vulgarise pas la norme, il la précède).
A priori, j'étais parti sur l'idée de lire linéairement le
Braquelaire, dont je suis pour l'instant très content, mais
effectivement je devrais consulter un peu plus le K&R (d'autant plus que
je l'ai sous la main).
Je ne sais pas si tout est clair pour moi, il faudra que je réfléchisse
encore un peu là-dessus, je reviendrai à la charge avec d'autres
questions au besoin.
En attendant, je pense que ça me ferait du bien de mieux comprendre le
processus de compilation : ce qu'est un fichier objet,
comme se passe
l'édition de liens (statique ou dynamique), etc.
Si vous avez des bonnes
lectures (mais pas trop longues) à me conseiller à ce sujet, je suis
preneur.
Je change la deuxième ligne de b.c en 'extern float var;', le
comportement à l'exécution ne change pas, et à la compilation je ne me
prends toujours pas d'avertissement (compilé avec gcc -Wall -pedantic).
Je change la deuxième ligne de b.c en 'extern float var;', le
comportement à l'exécution ne change pas, et à la compilation je ne me
prends toujours pas d'avertissement (compilé avec gcc -Wall -pedantic).
Je change la deuxième ligne de b.c en 'extern float var;', le
comportement à l'exécution ne change pas, et à la compilation je ne me
prends toujours pas d'avertissement (compilé avec gcc -Wall -pedantic).
En attendant, je pense que ça me ferait du bien de mieux comprendre le
processus de compilation : ce qu'est un fichier objet,
A ce stade, il me semble pour le moins étrange que tu n'en ai pas saisi
le sens. Un fichier objet est une étape intermédiaire dans le processus
(une fois que tu as l'exécutable, tu peux t'en débarrasser).
Mais je ne suis pas sûr de t'éclaircir, que ne comprends-tu pas
exactement ? Des exemples ?
L'éditeur de lien corrèle les fichiers objets. Il en prend plusieurs,
les "lie" ensemble en un seul fichier objet (cas d'une bibliothèque) ou
fichier exécutable (cas d'un programme) tout en vérifiant d'un point de
vue global ce que le compilateur n'aura pu vérifier lui-même de son
point de vue local (ie. unité de compilation). Ca, je crois que tu
l'avais compris.
La bibliothèque statique est le cas le plus simple [snip explications]
Une bibliothèque dynamique, c'est grosso modo pareil, [snip aussi]
La manière dont tout cela se passe (je suppose que ton "comme" =
"comment"), ma foi, cela dépend fortement de l'âge du capitaine : chaque
système a sa manière de faire, avec moult subtilités toutes aussi
barbantes les unes que les autres. Cela dépasse largement le cadre de ce
groupe... et puis il va peut-être falloir penser à changer le sujet de
l'enfilade si ça continue ;)
Diantre ! le sujet est vaste, ça va être dur de trouver quelque-chose de
court... je suis sûr que les autres contributeurs vont te dégotter
quelque-chose de correct, mais court, il ne faut pas trop rêver.
En attendant, je pense que ça me ferait du bien de mieux comprendre le
processus de compilation : ce qu'est un fichier objet,
A ce stade, il me semble pour le moins étrange que tu n'en ai pas saisi
le sens. Un fichier objet est une étape intermédiaire dans le processus
(une fois que tu as l'exécutable, tu peux t'en débarrasser).
Mais je ne suis pas sûr de t'éclaircir, que ne comprends-tu pas
exactement ? Des exemples ?
L'éditeur de lien corrèle les fichiers objets. Il en prend plusieurs,
les "lie" ensemble en un seul fichier objet (cas d'une bibliothèque) ou
fichier exécutable (cas d'un programme) tout en vérifiant d'un point de
vue global ce que le compilateur n'aura pu vérifier lui-même de son
point de vue local (ie. unité de compilation). Ca, je crois que tu
l'avais compris.
La bibliothèque statique est le cas le plus simple [snip explications]
Une bibliothèque dynamique, c'est grosso modo pareil, [snip aussi]
La manière dont tout cela se passe (je suppose que ton "comme" =
"comment"), ma foi, cela dépend fortement de l'âge du capitaine : chaque
système a sa manière de faire, avec moult subtilités toutes aussi
barbantes les unes que les autres. Cela dépasse largement le cadre de ce
groupe... et puis il va peut-être falloir penser à changer le sujet de
l'enfilade si ça continue ;)
Diantre ! le sujet est vaste, ça va être dur de trouver quelque-chose de
court... je suis sûr que les autres contributeurs vont te dégotter
quelque-chose de correct, mais court, il ne faut pas trop rêver.
En attendant, je pense que ça me ferait du bien de mieux comprendre le
processus de compilation : ce qu'est un fichier objet,
A ce stade, il me semble pour le moins étrange que tu n'en ai pas saisi
le sens. Un fichier objet est une étape intermédiaire dans le processus
(une fois que tu as l'exécutable, tu peux t'en débarrasser).
Mais je ne suis pas sûr de t'éclaircir, que ne comprends-tu pas
exactement ? Des exemples ?
L'éditeur de lien corrèle les fichiers objets. Il en prend plusieurs,
les "lie" ensemble en un seul fichier objet (cas d'une bibliothèque) ou
fichier exécutable (cas d'un programme) tout en vérifiant d'un point de
vue global ce que le compilateur n'aura pu vérifier lui-même de son
point de vue local (ie. unité de compilation). Ca, je crois que tu
l'avais compris.
La bibliothèque statique est le cas le plus simple [snip explications]
Une bibliothèque dynamique, c'est grosso modo pareil, [snip aussi]
La manière dont tout cela se passe (je suppose que ton "comme" =
"comment"), ma foi, cela dépend fortement de l'âge du capitaine : chaque
système a sa manière de faire, avec moult subtilités toutes aussi
barbantes les unes que les autres. Cela dépasse largement le cadre de ce
groupe... et puis il va peut-être falloir penser à changer le sujet de
l'enfilade si ça continue ;)
Diantre ! le sujet est vaste, ça va être dur de trouver quelque-chose de
court... je suis sûr que les autres contributeurs vont te dégotter
quelque-chose de correct, mais court, il ne faut pas trop rêver.
Pour l'instant, j'ai tendance à croire que déclarer un identifiant, ça
revient à dire au compilateur « ceci est l'indentifiant d'un objet de
tel type, ne gueule pas si tu me vois utiliser cet identifiant
conformément à ce type » alors que la définition, c'est ce qui fait que
le compilateur va effectivement réserver un place en mémoire pour
l'objet. Suis-je à côté de la plaque sur ce point ?
Pour l'instant, j'ai tendance à croire que déclarer un identifiant, ça
revient à dire au compilateur « ceci est l'indentifiant d'un objet de
tel type, ne gueule pas si tu me vois utiliser cet identifiant
conformément à ce type » alors que la définition, c'est ce qui fait que
le compilateur va effectivement réserver un place en mémoire pour
l'objet. Suis-je à côté de la plaque sur ce point ?
Pour l'instant, j'ai tendance à croire que déclarer un identifiant, ça
revient à dire au compilateur « ceci est l'indentifiant d'un objet de
tel type, ne gueule pas si tu me vois utiliser cet identifiant
conformément à ce type » alors que la définition, c'est ce qui fait que
le compilateur va effectivement réserver un place en mémoire pour
l'objet. Suis-je à côté de la plaque sur ce point ?
En fait, une question simple : si on compile le source avec l'option -S
de gcc, est-ce que le fichier assembleur obtenu contient exactement la
même information que le fichier .o ?
En fait, une question simple : si on compile le source avec l'option -S
de gcc, est-ce que le fichier assembleur obtenu contient exactement la
même information que le fichier .o ?
En fait, une question simple : si on compile le source avec l'option -S
de gcc, est-ce que le fichier assembleur obtenu contient exactement la
même information que le fichier .o ?
Dans l'article <gt49ca$hch$,
Antoine Leca écrit:Donc à moins que le linker version machin ne sache pas lire correctement
le Mach-o fourni par le compilateur (ce qui semblerait surprenant), le
défaut réel est que le compilateur génère une définition (probablement
un common, plus précisement un .undef de taille non nulle) qui n'est
pas^W plus conforme à ce qu'attend cette version-là de ld ; autrement
dit, la solution correcte du point de vue de la norme devrait être de
modifier le compilateur pour ne plus générer de variables
communautarisées... (évidemment, d'un point de vue plus général de
qualité de l'implémentation, cela ne sera pas résolu de cette façon,
c'est ld qui va plier devant GCC + la quantité de code qui assume de
facto le modèle Unix.)
Donc le bug serait lié à une version particulière de GCC?
Dans l'article <gt49ca$hch$1@shakotay.alphanet.ch>,
Antoine Leca <root@localhost.invalid> écrit:
Donc à moins que le linker version machin ne sache pas lire correctement
le Mach-o fourni par le compilateur (ce qui semblerait surprenant), le
défaut réel est que le compilateur génère une définition (probablement
un common, plus précisement un .undef de taille non nulle) qui n'est
pas^W plus conforme à ce qu'attend cette version-là de ld ; autrement
dit, la solution correcte du point de vue de la norme devrait être de
modifier le compilateur pour ne plus générer de variables
communautarisées... (évidemment, d'un point de vue plus général de
qualité de l'implémentation, cela ne sera pas résolu de cette façon,
c'est ld qui va plier devant GCC + la quantité de code qui assume de
facto le modèle Unix.)
Donc le bug serait lié à une version particulière de GCC?
Dans l'article <gt49ca$hch$,
Antoine Leca écrit:Donc à moins que le linker version machin ne sache pas lire correctement
le Mach-o fourni par le compilateur (ce qui semblerait surprenant), le
défaut réel est que le compilateur génère une définition (probablement
un common, plus précisement un .undef de taille non nulle) qui n'est
pas^W plus conforme à ce qu'attend cette version-là de ld ; autrement
dit, la solution correcte du point de vue de la norme devrait être de
modifier le compilateur pour ne plus générer de variables
communautarisées... (évidemment, d'un point de vue plus général de
qualité de l'implémentation, cela ne sera pas résolu de cette façon,
c'est ld qui va plier devant GCC + la quantité de code qui assume de
facto le modèle Unix.)
Donc le bug serait lié à une version particulière de GCC?