3

OS の外部プログラムとしてフラット バイナリ ファイルを使用しています。それらをコンパイルすると、次のようになります。

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 を実行すると (elf で実行しましたが、これと同じコードがあることを確認しました):

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 で行います.

これをアセンブリでコーディングせずに、出力ビンファイルに文字を含めるにはどうすればよいですか?
前もって感謝します。

4

2 に答える 2

4

通常、バイナリ実行可能ファイルは複数のセクションに分割されます。文字列は、コードとは別のセクションに配置されているだけです。コードは読み取り専用である必要がありますが、文字列は非定数で揮発性であると宣言されているため、これは理にかなっています。

于 2012-12-28T07:02:36.567 に答える
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
于 2013-02-21T01:54:28.883 に答える