在Windows上嵌入使用gcc

时间:2013-05-06 16:56:03

标签: gcc

我正在尝试使用gcc进行嵌入式程序生成。 gcc来自Mingw工具集, 这与我用于在Windows下生成常规应用程序的gcc相同。我在尝试着 生成一个位于0x1000的直接二进制文件,用于嵌入式i386 / 32位系统。 它在Bochs下进行测试。

我的链接器文件如下所示:

/* a list of files to link */
INPUT(test.o)

/* output format */
OUTPUT_FORMAT("pe-i386")

/* output filename */
/* OUTPUT_FILENAME("test.out") */

/* list of our memory sections */
MEMORY
{
  ram   : o = 0x1000, l = 256k
}

/* place sections */
SECTIONS
{

  /* code and constants */
  .text :
  {
    __text_start = .;
    *(.text)
    *(.strings)
     __text_end = .;
  }  > ram 

  /* initialized data */
  .data :
  {
    __data_start = .;
    *(.data)
    __data_end = .;
  } > ram

  /* uninitialized data */
  .bss :
  {
     __bss_start = . ; 
    *(.bss)
    *(COMMON)
     __bss_end = . ;  
  }  > ram

}

基本上,它意味着将所有内容连接到RAM中的目标地址0x1000。

如果我选择PE文件以外的任何目标,我会得到:

无法在非PE文件上执行PE操作...

这里说的其他消息是Windows上ld的已知问题。所以我再做一次 步骤使用objcopy创建一个二进制文件,工作正常。

以下是输出部分:

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000038  ffc01000  ffc01000  00001000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .rdata        00000010  ffc02000  ffc02000  00002000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .eh_frame     00000038  ffc03000  ffc03000  00003000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA

所以这些部分在页框地址(4kb)上对齐,我喜欢。 这是.text框架的反汇编:

test.pe:     file format pe-i386


Disassembly of section .text:

ffc01000 <_crap>:
ffc01000:       55                      push   ebp
ffc01001:       89 e5                   mov    ebp,esp
ffc01003:       83 ec 10                sub    esp,0x10
ffc01006:       c7 45 f8 00 20 00 00    mov    DWORD PTR [ebp-0x8],0x2000
ffc0100d:       c7 45 fc 00 80 0b 00    mov    DWORD PTR [ebp-0x4],0xb8000
ffc01014:       eb 14                   jmp    ffc0102a <_crap+0x2a> 
ffc01016:       8b 45 f8                mov    eax,DWORD PTR [ebp-0x8]
ffc01019:       8a 00                   mov    al,BYTE PTR [eax]
ffc0101b:       66 98                   cbw
ffc0101d:       8b 55 fc                mov    edx,DWORD PTR [ebp-0x4]
ffc01020:       66 89 02                mov    WORD PTR [edx],ax
ffc01023:       83 45 fc 02             add    DWORD PTR [ebp-0x4],0x2
ffc01027:       ff 45 f8                inc    DWORD PTR [ebp-0x8]
ffc0102a:       83 7d f8 00             cmp    DWORD PTR [ebp-0x8],0x0
ffc0102e:       75 e6                   jne    ffc01016 <_crap+0x16>
ffc01030:       b8 00 00 00 00          mov    eax,0x0
ffc01035:       c9                      leave
ffc01036:       c3                      ret
ffc01037:       90                      nop

所以我不知道它是如何或为何将代码定位在0xffc01000,这不是我的意思 在链接器指令文件中指定。

认为这是PE文件格式的一些工件,我试图选择 其他输出格式如elf,但如果我这样做,我点击“无法执行PE操作 在非PE输出文件“bug。

问题是:

  1. 为什么它位于0xffc01000?即使在上下文中,这似乎也没有意义 一个Windows程序。
  2. 有没有办法正确定位程序?
  3. 我是否需要使用与Windows无关的i386 gcc版本?
  4. 谢谢,

    Scott Moore

0 个答案:

没有答案