Pages : 1
#1 Le 24/06/2008, à 18:06
- ®om
assembler?
Salut,
Pour voir un peu comment fonctionne as, je souhaite assembler un programme (source asm → binaire exécutable).
J'ai créé un fichier test.c, dont voici le source :
int main() {
return 0;
}
Je le compile avec gcc -S test.c, ce qui me donne test.s :
.file "test.c"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
movl $0, %eax
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)"
.section .note.GNU-stack,"",@progbits
Je tente de l'assembler avec as test.s, ça me génère un a.out, sur lequel je fais un chmod +x.
Mais quand j'essaie de l'exécuter :
$ ./a.out
bash: ./a.out : impossible d'exécuter le fichier binaire
Comment se fait-ce?
Merci de votre aide.
Hors ligne
#2 Le 24/06/2008, à 18:14
- aeacides
Re : assembler?
tiens un peu de doc:
http://www.faqs.org/docs/Linux-HOWTO/Assembly-HOWTO.html
Sinon compile selon cette syntaxe:
as -o hello.o hello.S
ref: http://www.faqs.org/docs/Linux-HOWTO/Assembly-HOWTO.html#S-QUICK
ensuite pour créer un executable avec ton propre output,
ld -s -o hello hello.o
Dernière modification par aeacides (Le 24/06/2008, à 18:15)
http://www.q-be.ca
Hors ligne
#3 Le 24/06/2008, à 18:19
- ®om
Re : assembler?
rom@rom-laptop:~/test$ as -o test.o test.s
rom@rom-laptop:~/test$ ld -s -o test test.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048074
rom@rom-laptop:~/test$ ./test
Erreur de segmentation
Hors ligne
#4 Le 24/06/2008, à 18:37
- aeacides
Re : assembler?
Qu'est-ce que ces commandes te renvoie?
objdump -d test
objdump -r test
http://www.q-be.ca
Hors ligne
#5 Le 24/06/2008, à 18:43
- ®om
Re : assembler?
rom@rom-laptop:~/test$ objdump -d test
test: file format elf32-i386
Disassembly of section .text:
08048074 <.text>:
8048074: 8d 4c 24 04 lea 0x4(%esp),%ecx
8048078: 83 e4 f0 and $0xfffffff0,%esp
804807b: ff 71 fc pushl -0x4(%ecx)
804807e: 55 push %ebp
804807f: 89 e5 mov %esp,%ebp
8048081: 51 push %ecx
8048082: b8 00 00 00 00 mov $0x0,%eax
8048087: 59 pop %ecx
8048088: 5d pop %ebp
8048089: 8d 61 fc lea -0x4(%ecx),%esp
804808c: c3 ret
rom@rom-laptop:~/test$ objdump -r test
test: file format elf32-i386
Merci pour ces commandes, justement ma 2e question concernait la décompilation
Quel paramètre faut-il pour qu'il n'écrive que le code asm en sortie, sans les adresses et l'hexa?
Hors ligne
#6 Le 24/06/2008, à 18:53
- aeacides
Re : assembler?
Désolé je connais pas trop ça, mais je crois que cette section pourrait répondre à ta question. Je vais continuer de regarder, des fois que je trouverais ce que tu cherches ...
http://www.faqs.org/docs/Linux-HOWTO/Assembly-HOWTO.html#P-GCC
http://www.q-be.ca
Hors ligne
#7 Le 24/06/2008, à 19:01
- aeacides
Re : assembler?
tiens je viens de dénicher ça:
gcc -c -O2 -Wa,-al hello.c
Ce 2e exemple avec l'option h rajouter à -al va te sortir un output un peu plus compréhensible.
gcc -c -g -O2 -Wa,-alh hello.c
Ref: http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/devtools/s1-assembler-listings.html
http://www.q-be.ca
Hors ligne
Pages : 1