2012-12-28 2 views
3

J'utilise des fichiers binaires plats en tant que programmes externes pour mon système d'exploitation. Quand je les compiles, comme ceci:Inclure le contenu de char array dans un fichier binaire plat

gcc -Wall ctest.c -o ctest.bin -nostdlib -Wl,-Ttext=0x8000,-nostdlib -masm=intel 
objcopy -O binary -j .text ctest.bin ctest 

Mais, ce faisant, le contenu du tableau de caractères ne sont pas mis dans le fichier. Ceci est mon code:

static volatile char string[4] = "Hi!\0"; 
static volatile char string2[15] = "Hello, World!\n\0"; 

int _start() 
{ 
    asm("mov eax, [string]"); 
    asm("mov ebx, 0x00"); 
    asm("int 0x01"); 
    asm("mov eax, [string2]"); 
    asm("mov ebx, 0x00"); 
    asm("int 0x01"); 
    return 0; 
} 

et quand je lance objdump (je l'ai couru sur l'elfe, mais je l'ai vérifié avait le même code que cela):

00008000 <_start>: 
8000: 55      push ebp 
8001: 89 e5     mov ebp,esp 
8003: a1 70 90 00 00   mov eax,ds:0x9070 
8008: bb 00 00 00 00   mov ebx,0x0 
800d: cd 01     int 0x1 
800f: a1 74 90 00 00   mov eax,ds:0x9074 
8014: bb 00 00 00 00   mov ebx,0x0 
8019: cd 01     int 0x1 
801b: b8 00 00 00 00   mov eax,0x0 
8020: 5d      pop ebp 
8021: c3      ret  

Comme vous pouvez le voir, la le texte est introuvable. J'espérais qu'il ferait quelque chose comme ceci: string db "Hi!", 0 que je ferais avec nasm.

Que dois-je faire pour inclure les caractères dans le fichier bin de sortie sans le coder dans l'assemblage?
Merci d'avance.

+0

Ajouté un peu plus Tags utiles –

+0

@GrijeshChauhan Merci, mais serait-ce vraiment qualifié comme intégré? Comme cela fonctionne sur un PC régulier. – farlepet

+0

Oui, mais j'ai ajouté que l'on peut remarquer que les gens travaillent pour embarqué. Je pense qu'ils peuvent aussi vous aider sur cette question :) –

Répondre

4

Un fichier exécutable binaire est généralement divisé en sections. Vos chaînes ont simplement été placées dans une section différente de celle du code. Cela est logique, car le code doit être en lecture seule mais les chaînes ont été déclarées non constantes et volatiles.

+0

Y at-il un moyen de les forcer dans la même section (texte je pense) avant/tout en faisant l'objcopy? – farlepet

+1

@farlepet: vous pouvez ajouter un '-j .data' aux arguments' objcopy' pour obtenir les chaînes dans le binaire. –

+0

@MichaelBurr: Quand je fais cela, il y a un espace de 4000 octets entre le texte et les sections de données, est-il possible de le supprimer sans le faire manuellement? – farlepet

1

J'ai compris comment le faire. D'abord, je créé un script éditeur de liens comme celui-ci (Vous pouvez changer phys à ce que l'adresse que vous voulez charger à):

OUTPUT_FORMAT("binary") 
ENTRY(start) 
phys = 0x8000; 
SECTIONS 
{ 
    .text phys : AT(phys) { 
    code = .; 
    *(.text) 
    *(.rodata) 
    . = ALIGN(0); 
    } 
    .data : AT(phys + (data - code)) 
    { 
    data = .; 
    *(.data) 
    . = ALIGN(0); 
    } 
    .bss : AT(phys + (bss - code)) 
    { 
    bss = .; 
    *(.bss) 
    . = ALIGN(0); 
    } 
    end = .; 
} 

ensuite compilé et lié l'exécutable comme celui-ci:

gcc -m32 -nostdlib -nostdinc -fno-builtin -o exec.o exec.c 
ld -T link.ld -melf_i386 -o exec.bin exec.o