Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[OFF] GCC et noms de fonctions (résolu)
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
Enlight
Advocate
Advocate


Joined: 28 Oct 2004
Posts: 3519
Location: Alsace (France)

PostPosted: Fri Nov 25, 2005 8:26 am    Post subject: [OFF] GCC et noms de fonctions (résolu) Reply with quote

Plop, Y'aurait-il des volontaires pour me faire un :

Code:
echo "int main() {return 0;}" >dummy.c
gcc -S dummy.c -o dummy.s
grep main dummy.s


Logiquement ça devrait retourner _main: mais bon hier soir je me suis apperçu que chez moi (gcc 3.3.6) ben ça faisait main:


Last edited by Enlight on Fri Nov 25, 2005 10:10 pm; edited 1 time in total
Back to top
View user's profile Send private message
marvin rouge
Veteran
Veteran


Joined: 01 Aug 2004
Posts: 1422
Location: Villa Lumierrante, Zonelibre

PostPosted: Fri Nov 25, 2005 8:34 am    Post subject: Reply with quote

Code:
#grep main dummy.s
.globl main
        .type   main, @function
main:
        .size   main, .-main


Au cas ou t'en as besoin:
Code:
# gcc-config -l
 [1] x86_64-pc-linux-gnu-3.3.4
 [2] x86_64-pc-linux-gnu-3.4.4 *
 [3] x86_64-pc-linux-gnu-3.4.4-hardened
 [4] x86_64-pc-linux-gnu-3.4.4-hardenednopie
 [5] x86_64-pc-linux-gnu-3.4.4-hardenednopiessp
 [6] x86_64-pc-linux-gnu-3.4.4-hardenednossp
 [7] x86_64-pc-linux-gnu-4.0.1


+

EDIT:
Code:
#cat dummy.s
        .file   "dummy.c"
        .text
.globl main
        .type   main, @function
main:
.LFB2:
        pushq   %rbp
.LCFI0:
        movq    %rsp, %rbp
.LCFI1:
        movl    $0, %eax
        leave
        ret
.LFE2:
        .size   main, .-main
        .section        .eh_frame,"a",@progbits
.Lframe1:
        .long   .LECIE1-.LSCIE1
.LSCIE1:
        .long   0x0
        .byte   0x1
        .string ""
        .uleb128 0x1
        .sleb128 -8
        .byte   0x10
        .byte   0xc
        .uleb128 0x7
        .uleb128 0x8
        .byte   0x90
        .uleb128 0x1
        .align 8
.LECIE1:
.LSFDE1:
        .long   .LEFDE1-.LASFDE1
.LASFDE1:
        .long   .LASFDE1-.Lframe1
        .quad   .LFB2
        .quad   .LFE2-.LFB2
        .byte   0x4
        .long   .LCFI0-.LFB2
        .byte   0xe
        .uleb128 0x10
        .byte   0x86
        .uleb128 0x2
        .byte   0x4
        .long   .LCFI1-.LCFI0
        .byte   0xd
        .uleb128 0x6
        .align 8
.LEFDE1:
        .section        .note.GNU-stack,"",@progbits
        .ident  "GCC: (GNU) 3.4.4 (Gentoo 3.4.4-r1, ssp-3.4.4-1.0, pie-8.7.8)"


/me comprend rien à ce qeu c'est.
:)
Back to top
View user's profile Send private message
Enlight
Advocate
Advocate


Joined: 28 Oct 2004
Posts: 3519
Location: Alsace (France)

PostPosted: Fri Nov 25, 2005 8:43 am    Post subject: Reply with quote

Ben le .s c'est la traduction assembleur du .c, mais normalement tous les noms de fonctions en C devraient être précédées d'un "_" (de l' assembleur à l'objet le nom ne change plus). En fait le truc c'est que les fonctions en C q ue je code vont être appelées depuis un programme en assembleur en faisant :

Code:
extern nom_de_fonction
call nom_de_fonction


or selon que gcc ajoutes des "_" ou pas aux noms de fonctions, ça me change la syntaxe du programme appelant, et si je me plante, le linker risque de ne pas aimer.
Back to top
View user's profile Send private message
marvin rouge
Veteran
Veteran


Joined: 01 Aug 2004
Posts: 1422
Location: Villa Lumierrante, Zonelibre

PostPosted: Fri Nov 25, 2005 8:48 am    Post subject: Reply with quote

je savais bien qu'il ne fallait pas que je dise que je comprenais rien ... :lol: j'ai eu la réponse que je méritais ...

c'est pas tout ça, mais y'a gavé de neige dans grenoble, j'vais aller faire qq photos. si t'as besoin d'autres tests, d'ici qq heures pour moi. +
Back to top
View user's profile Send private message
Enlight
Advocate
Advocate


Joined: 28 Oct 2004
Posts: 3519
Location: Alsace (France)

PostPosted: Fri Nov 25, 2005 8:53 am    Post subject: Reply with quote

marvin rouge wrote:
je savais bien qu'il ne fallait pas que je dise que je comprenais rien ... :lol: j'ai eu la réponse que je méritais ...

c'est pas tout ça, mais y'a gavé de neige dans grenoble, j'vais aller faire qq photos. si t'as besoin d'autres tests, d'ici qq heures pour moi. +


J'ai dit une connerie?
Back to top
View user's profile Send private message
boozo
Advocate
Advocate


Joined: 01 Jul 2004
Posts: 3193

PostPosted: Fri Nov 25, 2005 5:41 pm    Post subject: Reply with quote

nan c'est juste le côté étanche de la réponse je pense... :lol:

sinon pour moi :
Code:
bozo@cochise ~ $ grep main dummy.s
.globl main
        .type   main, @function
main:
        .size   main, .-main
bozo@cochise ~ $ gcc-config -l
 [1] i686-pc-linux-gnu-3.3.6 *
 [2] i686-pc-linux-gnu-3.3.6-hardened
 [3] i686-pc-linux-gnu-3.3.6-hardenednopie
 [4] i686-pc-linux-gnu-3.3.6-hardenednopiessp
 [5] i686-pc-linux-gnu-3.3.6-hardenednossp
bozo@cochise ~ $ cat dummy.s
        .file   "dummy.c"
        .text
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        subl    %eax, %esp
        movl    $0, %eax
        leave
        ret
        .size   main, .-main
        .section        .note.GNU-stack,"",@progbits
        .ident  "GCC: (GNU) 3.3.6 (Gentoo 3.3.6, ssp-3.3.6-1.0, pie-8.7.8)"
bozo@cochise ~ $

_________________
" Un psychotique, c'est quelqu'un qui croit dur comme fer que 2 et 2 font 5, et qui en est pleinement satisfait.
Un névrosé, c'est quelqu'un qui sait pertinemment que 2 et 2 font 4, et ça le rend malade ! "
Back to top
View user's profile Send private message
Enlight
Advocate
Advocate


Joined: 28 Oct 2004
Posts: 3519
Location: Alsace (France)

PostPosted: Fri Nov 25, 2005 6:12 pm    Post subject: Reply with quote

Comme quoi ça donne pas envie de faire de l'assembleur pour x86_64 :D .

Sinon, ça confirme ce que j'ai remarqué hier soir... pourtant je l'ai pas révée cette histoire de "_" ajouté devant les noms de fonctions :roll: ...
Back to top
View user's profile Send private message
boozo
Advocate
Advocate


Joined: 01 Jul 2004
Posts: 3193

PostPosted: Fri Nov 25, 2005 8:17 pm    Post subject: Reply with quote

c'est pas -mno-underscores ton flag ?

ps: /me n'a jamais fait d'assembleur... sais même pas a quoi çà ressemble çà... un assembleur... çà se mange ? :mrgreen:

[Edit] ha nan c'est pour les motorola çà :roll:
_________________
" Un psychotique, c'est quelqu'un qui croit dur comme fer que 2 et 2 font 5, et qui en est pleinement satisfait.
Un névrosé, c'est quelqu'un qui sait pertinemment que 2 et 2 font 4, et ça le rend malade ! "


Last edited by boozo on Fri Nov 25, 2005 8:33 pm; edited 1 time in total
Back to top
View user's profile Send private message
widan
Veteran
Veteran


Joined: 07 Jun 2005
Posts: 1512
Location: Paris, France

PostPosted: Fri Nov 25, 2005 8:25 pm    Post subject: Reply with quote

Enlight wrote:
Comme quoi ça donne pas envie de faire de l'assembleur pour x86_64 :D.

C'est pas si horrible si on vire tout ce qui n'est pas strictement nécessaire:
Code:
        .text
        .globl  main
 main:  pushq   %rbp
        movq    %rsp, %rbp
        movl    $0, %eax
        leave
        ret

Enlight wrote:
Sinon, ça confirme ce que j'ai remarqué hier soir... pourtant je l'ai pas révée cette histoire de "_" ajouté devant les noms de fonctions :roll: ...

En fait... on peut choisir:
Code:
widan@melanie /tmp/asm $ gcc -S dummy.c -o dummy.s                     
widan@melanie /tmp/asm $ grep main dummy.s
.globl main
        .type   main, @function
main:
        .size   main, .-main
widan@melanie /tmp/asm $ gcc -S dummy.c -o dummy.s -fleading-underscore
widan@melanie /tmp/asm $ grep main dummy.s
.globl _main
        .type   _main, @function
_main:
        .size   _main, .-_main
Back to top
View user's profile Send private message
boozo
Advocate
Advocate


Joined: 01 Jul 2004
Posts: 3193

PostPosted: Fri Nov 25, 2005 9:16 pm    Post subject: Reply with quote

alors moi je dis : "de nos jours... y font des trucs bizarres les comptables !" :lol:

l'effet d'une mutation sans doute ?! d'ailleurs... y'a qu'a lire qqs'uns de ses posts pour comprendre de quoi il retourne :mrgreen:
_________________
" Un psychotique, c'est quelqu'un qui croit dur comme fer que 2 et 2 font 5, et qui en est pleinement satisfait.
Un névrosé, c'est quelqu'un qui sait pertinemment que 2 et 2 font 4, et ça le rend malade ! "
Back to top
View user's profile Send private message
Leander256
l33t
l33t


Joined: 05 Jul 2003
Posts: 910
Location: Singapour

PostPosted: Fri Nov 25, 2005 9:41 pm    Post subject: Reply with quote

D'après mes recherches le fait de rajouter un _ devant les noms des fonctions semble dépendant de l'architecture et de l'OS, la seule chose qui semble donc certaine c'est qu'il n'y a pas de norme en la matière.
Back to top
View user's profile Send private message
Enlight
Advocate
Advocate


Joined: 28 Oct 2004
Posts: 3519
Location: Alsace (France)

PostPosted: Fri Nov 25, 2005 10:10 pm    Post subject: Reply with quote

Yes! Merci les gars, effectivement, il faut que je fasse gaffe, je pensais qu'en travaillant sans librairies et headers system (fno-builtin) j'étais 100% portable que je code sous windows ou nux, ben non sous win -fleading-underscore est activé par défaut pour gcc. Chose rassurante, a priori je suis pas le seul à m'être fait avoir.

@widan : oui l'initialisation de la stack (hormis qu'elle soit en 64 bits), mise à zéro d'%eax (quoique le long il fait quelle taille sur amd64, parceque %eax ça sonne 32 bits donc c'est intriguant) le ret, ça reste du classique, mais tout le voodoo autours... ça doit bien avoir une raison d'être.

@boozoo : on voit que t'as jamais fait de compta toi :lol:
Back to top
View user's profile Send private message
widan
Veteran
Veteran


Joined: 07 Jun 2005
Posts: 1512
Location: Paris, France

PostPosted: Fri Nov 25, 2005 11:31 pm    Post subject: Reply with quote

Enlight wrote:
mise à zéro d'%eax (quoique le long il fait quelle taille sur amd64, parceque %eax ça sonne 32 bits donc c'est intriguant)

Sur un amd64, les long et les pointeurs font 8 octets et les int font 4 octets (c'est pour ça qu'il ne faut jamais caster un pointeur [8 octets] en int [4 octets]...). Mais main() est déclarée comme retournant un int, donc 4 octets, d'où utilisation de eax (l'instruction est plus courte de 2 octets, c'est sûrement pour ça que gcc utilise eax plutôt que rax).
Enlight wrote:
mais tout le voodoo autours... ça doit bien avoir une raison d'être

D'après cette page, sur amd64 utiliser le frame pointer rbp est optionel (et l'omettre est autorisé par l'ABI, contrairement au x86 - c'est possible pour les 2, mais un compilo aurait "le droit" de le faire par défaut sur amd64, et pas sur x86 si il veut respecter l'ABI). Donc pour que les programmes soient débuggables sans fp (surtout pour pouvoir avoir la trace des appels), on rajoute une section .eh_frame dans le fichier ELF, qui contient apparemment les infos nécessaires pour être capable de retrouver le début des stack frames sans frame pointer. Ca sert également à la gestion des exceptions en C++, qui a également besoin d'être capable de retrouver le stack frame de la fonction qui va gérer l'exception. D'ailleurs le "eh" de .eh_frame c'est sûrement pour "exception handling".

Ces infos sont conçues pour être lues par des programmes, pas par des humains, c'est pour ça que ça semble incompréhensible.
Back to top
View user's profile Send private message
marvin rouge
Veteran
Veteran


Joined: 01 Aug 2004
Posts: 1422
Location: Villa Lumierrante, Zonelibre

PostPosted: Sat Nov 26, 2005 9:42 am    Post subject: Reply with quote

ouh là là, vu mon incompétence notoire en programmation, et vu ma stupéfaction en lisant les réponses, j'ai bien fait d'aller faire de la photo hier, moi ...
:lol:
Back to top
View user's profile Send private message
kopp
Advocate
Advocate


Joined: 09 Apr 2004
Posts: 2885
Location: Grenoble, France

PostPosted: Sat Nov 26, 2005 12:34 pm    Post subject: Reply with quote

marvin rouge wrote:

c'est pas tout ça, mais y'a gavé de neige dans grenoble, j'vais aller faire qq photos. si t'as besoin d'autres tests, d'ici qq heures pour moi. +


Si t'as tes photos sympa, j'suis pas contre ;)
Moi je l'ai plus vue du point de vue !@#?!@ de voitures qui passe a fond à côté de moi!

Enfin, j'ai encore plus d ecm sous ma fenètre :)
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum