2010-08-23 5 views
9

Hey, j'ai créé un fichier ELF à la main, il a deux sections (.text et .shstrtab) et un en-tête de programme qui charge la section .text. La section .text est très faible et il ne se compose que de suivre trois instructions ...ELF fichier à la main

# and exit 
    movl $0,%ebx  # first argument: exit code 
    movl $1,%eax  # system call number (sys_exit) 
    int  $0x80   # call kernel 

Le readelf ne se plaint pas quand je l'exécute sur ce fichier elfe. Si j'exécute ce fichier, alors dès que je l'exécute, il est tué et le message "Killed" apparaît à l'écran. Je suis passé par le post suivant ici au stackoverflow et je suis toujours en train de le parcourir. Maintenant, ce qui me préoccupe, c'est que ce programme ne demande pas de mémoire (supplémentaire) et est-il vraiment possible de faire un ELF à la main et de s'attendre à ce qu'il soit toléré du tout par le système ?.

Merci,

+0

Avez-vous lu http: // www.muppetlabs.com/~breadbox/software/tiny/teensy.html? C'est ELF fait à la main à l'extrême. – camh

+1

Oui, je l'ai lu, c'est une bonne lecture. – Sohail

+1

Toujours trouver la cause de l'accident? –

Répondre

11

Le ELF loader peut envoyer SIGKILL à votre processus pour diverses raisons; vous avez probablement une mauvaise adresse et/ou une longueur quelque part dans les en-têtes.

par exemple. un segment PT_LOAD doit mapper la partie appropriée de l'exécutable à une adresse sensible (l'adresse habituelle pour x86 Linux est 0x08048000, bien que ce ne soit probablement pas critique tant que la page est alignée, pas 0 et pas trop élevée) et les adresses dans les deux l'en-tête de section .text et le point d'entrée dans l'en-tête ELF doivent correspondre à cela.

Il n'y a aucune raison de ne pas pouvoir le faire à la main (si l'éditeur de liens peut le créer, vous aussi!) - si vous le souhaitez vraiment. Mais notez que si vous assemblez simplement un lien avec des symboles puis dénudés (le drapeau -sld ci-dessous):

$ cat exit.s 
.globl _start 
_start: 
movl $0,%ebx 
movl $1,%eax 
int $0x80 
$ as -o exit.o exit.s 
$ ld -s -o exit exit.o 
$ ./exit 
$ hexdump -Cv exit 
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 
00000010 02 00 03 00 01 00 00 00 54 80 04 08 34 00 00 00 |........T...4...| 
00000020 74 00 00 00 00 00 00 00 34 00 20 00 01 00 28 00 |t.......4. ...(.| 
00000030 03 00 02 00 01 00 00 00 00 00 00 00 00 80 04 08 |................| 
00000040 00 80 04 08 60 00 00 00 60 00 00 00 05 00 00 00 |....`...`.......| 
00000050 00 10 00 00 bb 00 00 00 00 b8 01 00 00 00 cd 80 |................| 
00000060 00 2e 73 68 73 74 72 74 61 62 00 2e 74 65 78 74 |..shstrtab..text| 
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000090 00 00 00 00 00 00 00 00 00 00 00 00 0b 00 00 00 |................| 
000000a0 01 00 00 00 06 00 00 00 54 80 04 08 54 00 00 00 |........T...T...| 
000000b0 0c 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 |................| 
000000c0 00 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 |................| 
000000d0 00 00 00 00 60 00 00 00 11 00 00 00 00 00 00 00 |....`...........| 
000000e0 00 00 00 00 01 00 00 00 00 00 00 00    |............| 
000000ec 
$ 

... le résultat est assez minime de toute façon (probablement suffisamment minime pour comparer avec votre défaut de fabrication artisanale main fichier pour voir où vous avez mal tourné).

+0

Merci pour la réponse, Votre avis est bon. Je vais le suivre. Mon fichier fabriqué à la main est maintenant devenu assez grand mais j'ai quand même le même résultat quand j'essaie de l'exécuter. Merci encore une fois pour la réponse. – Sohail

+0

J'ai essayé de voter votre réponse mais il faut 15 réputations pour le faire, je reviendrai quand j'en aurai autant. – Sohail

+0

L'entrée PT_LOAD doit être marquée comme lisible et exécutable. – ysdx

0

Récemment, j'ai également essayé de faire des expériences similaires.
Pendant le processus, je reçois également les informations d'erreur lors de l'exécution du fichier elf généré, il semble
résulte du mauvais réglage de la viraddr et le placement des segments, diff votre propre fichier elf
avec un fichier elf standard (compilé et lié).
Soit dit en passant, à Keey la simplicité de la norme a.out fichier Elf, vous pouvez utiliser le paramètre -s
pour éliminer les tables de symboles dans le fichier elf: ld -s ao

Questions connexes