【问题标题】:Include contents of char array in flat binary file在平面二进制文件中包含 char 数组的内容
【发布时间】:2012-12-13 11:39:54
【问题描述】:

我正在使用平面二进制文件作为我的操作系统的外部程序。当我编译它们时,像这样:

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 做。

我应该怎么做才能在输出 bin 文件中包含字符而不在程序集中对此进行编码?
提前致谢。

【问题讨论】:

  • 添加了一些更有用的标签
  • @GrijeshChauhan 谢谢,但这真的有资格作为嵌入式吗?因为这是在普通 PC 上运行的。
  • 是的,但是我添加了这样可以注意到人们为嵌入式工作。我认为他们也可以帮助您解决这个问题:)
  • @GrijeshChauhan:那不是只检查文件吗?我在任何地方都找不到用它创建二进制文件的方法。
  • 你给 objdump 什么标志?

标签: c assembly embedded inline-assembly osdev


【解决方案1】:

二进制可执行文件通常分为多个部分。您的字符串只是被放置在与代码不同的部分中。这是有道理的,因为代码应该是只读的,但字符串已被声明为非常量和易失性。

【讨论】:

  • 在执行 objcopy 之前/期间有没有办法强制它们进入同一部分(我认为是文本)?
  • @farlepet:您可以在 objcopy 参数中添加 -j .data 以将字符串放入二进制文件中。
  • @MichaelBurr:当我这样做时,文本和数据部分之间有 4000 字节的间隙,有没有办法在不手动操作的情况下删除它?
  • @farlepet,尝试只声明字符串 const 并删除 volatile。它们的去向仍然取决于编译器,但它们被放置在文本部分的机会会增加。
  • @MarkRansom:我试过了,但没有将它们包含在 .text 部分中,现在当我将 objcopy 与 -j .data 一起使用时,它不会在文本部分之后添加任何内容
【解决方案2】:

我想出了怎么做。 首先,我创建了一个这样的链接器脚本(您可以将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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2020-06-28
    • 2016-02-29
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多