2012-12-28 23 views
3

我正在使用平面二進制文件作爲我的操作系統的外部程序。當我編譯他們,就像這樣:在平面二進制文件中包含char數組的內容

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

但這樣做,字符數組的內容都沒有把在文件中。這是我的代碼:

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; 
} 

,當我運行objdump的(我跑了它的小精靈,但我確認它有相同的代碼,因爲這):

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  

正如你所看到的,文字無處可尋。我希望它會做這樣的事情:string db "Hi!", 0,我會用nasm做。

我該怎麼做,它包括輸出bin文件中的字符,而無需在程序集中對其進行編碼?
在此先感謝。

+0

更增添了幾分有用的標籤 –

+0

@GrijeshChauhan謝謝,但這真的符合嵌入?因爲這是在普通PC上運行。 – farlepet

+0

是的,但我補充說,可以注意到爲嵌入式工作的人。我認爲他們也可以幫助你解決這個問題:) –

回答

4

二進制可執行文件通常分爲多個部分。您的字符串已被放置在與代碼不同的部分。這是有道理的,因爲代碼應該是隻讀的,但字符串被聲明爲非常量和易失性。

+0

有沒有什麼辦法在做objcopy之前/之中強制它們進入同一部分(我認爲的文本)? – farlepet

+1

@farlepet:你可以在'objcopy'參數中加入一個'-j .data'來獲取字符串到二進制文件中。 –

+0

@MichaelBurr:當我這樣做時,文本和數據部分之間有一個4000字節的空隙,有沒有辦法在不手動的情況下刪除它? – farlepet

1

我想出瞭如何去做。 首先,我創造了這樣一個鏈接腳本(你可以改變phys到您希望加載它的任何地址):

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 = .; 
} 

然後編譯和鏈接這樣的可執行文件:

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