View previous topic :: View next topic |
Author |
Message |
Enlight Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/34498084446f6e929bedfd.jpg)
Joined: 28 Oct 2004 Posts: 3519 Location: Alsace (France)
|
Posted: Fri Nov 25, 2005 8:26 am Post subject: [OFF] GCC et noms de fonctions (résolu) |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
marvin rouge Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/11635284444403688a3df85.jpg)
Joined: 01 Aug 2004 Posts: 1422 Location: Villa Lumierrante, Zonelibre
|
Posted: Fri Nov 25, 2005 8:34 am Post subject: |
|
|
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.
![Smile :)](images/smiles/icon_smile.gif) |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
Enlight Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/34498084446f6e929bedfd.jpg)
Joined: 28 Oct 2004 Posts: 3519 Location: Alsace (France)
|
Posted: Fri Nov 25, 2005 8:43 am Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
marvin rouge Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/11635284444403688a3df85.jpg)
Joined: 01 Aug 2004 Posts: 1422 Location: Villa Lumierrante, Zonelibre
|
Posted: Fri Nov 25, 2005 8:48 am Post subject: |
|
|
je savais bien qu'il ne fallait pas que je dise que je comprenais rien ... 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 |
|
![](templates/gentoo/images/spacer.gif) |
Enlight Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/34498084446f6e929bedfd.jpg)
Joined: 28 Oct 2004 Posts: 3519 Location: Alsace (France)
|
Posted: Fri Nov 25, 2005 8:53 am Post subject: |
|
|
marvin rouge wrote: | je savais bien qu'il ne fallait pas que je dise que je comprenais rien ... 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 |
|
![](templates/gentoo/images/spacer.gif) |
boozo Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/83658268945e337605eec8.gif)
Joined: 01 Jul 2004 Posts: 3193
|
Posted: Fri Nov 25, 2005 5:41 pm Post subject: |
|
|
nan c'est juste le côté étanche de la réponse je pense...
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 |
|
![](templates/gentoo/images/spacer.gif) |
Enlight Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/34498084446f6e929bedfd.jpg)
Joined: 28 Oct 2004 Posts: 3519 Location: Alsace (France)
|
Posted: Fri Nov 25, 2005 6:12 pm Post subject: |
|
|
Comme quoi ça donne pas envie de faire de l'assembleur pour x86_64 .
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 ... |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
boozo Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/83658268945e337605eec8.gif)
Joined: 01 Jul 2004 Posts: 3193
|
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
widan Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/142533236243680bda6f27b.jpg)
Joined: 07 Jun 2005 Posts: 1512 Location: Paris, France
|
Posted: Fri Nov 25, 2005 8:25 pm Post subject: |
|
|
Enlight wrote: | Comme quoi ça donne pas envie de faire de l'assembleur pour x86_64 . |
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 ... |
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 |
|
![](templates/gentoo/images/spacer.gif) |
boozo Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/83658268945e337605eec8.gif)
Joined: 01 Jul 2004 Posts: 3193
|
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
Leander256 l33t
![l33t l33t](/images/ranks/rank_rect_4.gif)
![](images/avatars/12696515763f31ef9a46a07.jpg)
Joined: 05 Jul 2003 Posts: 910 Location: Singapour
|
Posted: Fri Nov 25, 2005 9:41 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
Enlight Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/34498084446f6e929bedfd.jpg)
Joined: 28 Oct 2004 Posts: 3519 Location: Alsace (France)
|
Posted: Fri Nov 25, 2005 10:10 pm Post subject: |
|
|
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 ![Laughing :lol:](images/smiles/icon_lol.gif) |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
widan Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/142533236243680bda6f27b.jpg)
Joined: 07 Jun 2005 Posts: 1512 Location: Paris, France
|
Posted: Fri Nov 25, 2005 11:31 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
marvin rouge Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/11635284444403688a3df85.jpg)
Joined: 01 Aug 2004 Posts: 1422 Location: Villa Lumierrante, Zonelibre
|
Posted: Sat Nov 26, 2005 9:42 am Post subject: |
|
|
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 ...
![Laughing :lol:](images/smiles/icon_lol.gif) |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
kopp Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/134104650145d8aeb7e9db3.gif)
Joined: 09 Apr 2004 Posts: 2885 Location: Grenoble, France
|
Posted: Sat Nov 26, 2005 12:34 pm Post subject: |
|
|
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 ![Smile :)](images/smiles/icon_smile.gif) |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
|
|
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
|
|