ncloader  0.1
 모두 데이타 구조 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 매크로 그룹들 페이지들
Executable & Linkable File Format

ELF 파일 로더를 구현한다. 더 자세히 ...

+ Executable & Linkable File Format에 대한 협력 다이어그램:

데이타 구조

struct  elf_header
 
struct  elf32_dyn
 
struct  group
 
struct  Elf32_Phdr
 
struct  Elf32_Rel
 
struct  SymbolTable
 
struct  SectionHeader
 
struct  Elf32_Rela
 

매크로

#define ELF32_ST_BIND(i)   ((i)>>4)
 
#define ELF32_ST_TYPE(i)   ((i) & 0xf)
 
#define ELF32_ST_INFO(b, t)   (((b) << 4) + ((t) & 0xf))
 
#define ELF32_SET_ST_TYPE(v, i)   ((v) = ((v) & 0xF0) | ((i) & 0x0F))
 
#define ELF32_R_SYM(i)   ((i) >> 8)
 
#define ELF32_R_TYPE(i)   ((unsigned char)(i))
 
#define INVALID   (~0)
 
#define IS_TEXT(flags)   (((flags) & SHF_EXECINSTR) == SHF_EXECINSTR && ((flags) & SHF_ALLOC) == SHF_ALLOC)
 
#define IS_RODATA(flags)   (((flags) & SHF_ALLOC) == SHF_ALLOC && ((flags) & SHF_WRITE) != SHF_WRITE && ((flags) & SHF_EXECINSTR) != SHF_EXECINSTR)
 
#define IS_RWDATA(flags)   (((flags) & SHF_ALLOC) == SHF_ALLOC && ((flags) & SHF_WRITE) == SHF_WRITE && ((flags) & SHF_EXECINSTR) != SHF_EXECINSTR)
 
#define FIX_ALIGN(ptr)
 

타입정의

typedef unsigned long Elf32_Addr
 
typedef unsigned short Elf32_Half
 
typedef unsigned long Elf32_Off
 
typedef unsigned long Elf32_Sword
 
typedef unsigned long Elf32_Word
 
typedef struct elf_header Elf32_Hdr
 
typedef struct SectionHeader Elf32_Shdr
 
typedef void(* exec_entry )(char *args, char *envs)
 

열거형 타입

enum  E_TYPE {
  ET_NONE = 0, ET_REL = 1, ET_EXEC = 2, ET_DYN = 3,
  ET_CORE = 4, ET_LOPROC = 0xff00, ET_HIPROC = 0xffff, ET_NONE = 0,
  ET_REL = 1, ET_EXEC = 2, ET_DYN = 3, ET_CORE = 4,
  ET_LOPROC = 0xff00, ET_HIPROC = 0xffff
}
 
enum  E_MACHINE {
  EM_NONE = 0, EM_M32 = 1, EM_SPARC = 2, EM_386 = 3,
  EM_68K = 4, EM_88K = 5, EM_860 = 7, EM_MIPS = 8,
  EM_NONE = 0, EM_M32 = 1, EM_SPARC = 2, EM_386 = 3,
  EM_68K = 4, EM_88K = 5, EM_860 = 7, EM_MIPS = 8
}
 
enum  E_VERSION { EV_NONE = 0, EV_CURRENT = 1, EV_NONE = 0, EV_CURRENT = 1 }
 
enum  ELF_IDENTIFICATION {
  EI_MAG0 = 0, EI_MAG1 = 1, EI_MAG2 = 2, EI_MAG3 = 3,
  EI_CLASS = 4, EI_DATA = 5, EI_VERSION = 6, EI_PAD = 7,
  EI_NIDENT = 16, EI_MAG0 = 0, EI_MAG1 = 1, EI_MAG2 = 2,
  EI_MAG3 = 3, EI_CLASS = 4, EI_DATA = 5, EI_VERSION = 6,
  EI_PAD = 7, EI_NIDENT = 16
}
 
enum  ELF_MAGIC {
  ELFMAG0 = 0x7f, ELFMAG1 = 'E', ELFMAG2 = 'L', ELFMAG3 = 'F',
  ELFMAG0 = 0x7f, ELFMAG1 = 'E', ELFMAG2 = 'L', ELFMAG3 = 'F'
}
 
enum  EFL_CLASS {
  ELFCLASSNONE = 0, ELFCLASS32 = 1, ELFCLASS64 = 2, ELFCLASSNONE = 0,
  ELFCLASS32 = 1, ELFCLASS64 = 2
}
 
enum  EI_DATA {
  ELFDATANONE = 0, ELFDATA2LSB = 1, ELFDATA2MSB = 2, ELFDATANONE = 0,
  ELFDATA2LSB = 1, ELFDATA2MSB = 2
}
 
enum  DT_TAG {
  DT_NULL = 0, DT_NEEDED = 1, DT_PLTRELSZ = 2, DT_PLTGOT = 3,
  DT_HASH = 4, DT_STRTAB = 5, DT_SYMTAB = 6, DT_RELA = 7,
  DT_RELASZ = 8, DT_RELAENT = 9, DT_STRSZ = 10, DT_SYMENT = 11,
  DT_INIT = 12, DT_FINI = 13, DT_SONAME = 14, DT_RPATH = 15,
  DT_SYMBOLIC = 16, DT_REL = 17, DT_RELSZ = 18, DT_RELENT = 19,
  DT_PLTREL = 20, DT_DEBUG = 21, DT_TEXTREL = 22, DT_JMPREL = 23,
  DT_LOPROC = 0x70000000, DT_HIPROC = 0x7fffffff, DT_NULL = 0, DT_NEEDED = 1,
  DT_PLTRELSZ = 2, DT_PLTGOT = 3, DT_HASH = 4, DT_STRTAB = 5,
  DT_SYMTAB = 6, DT_RELA = 7, DT_RELASZ = 8, DT_RELAENT = 9,
  DT_STRSZ = 10, DT_SYMENT = 11, DT_INIT = 12, DT_FINI = 13,
  DT_SONAME = 14, DT_RPATH = 15, DT_SYMBOLIC = 16, DT_REL = 17,
  DT_RELSZ = 18, DT_RELENT = 19, DT_PLTREL = 20, DT_DEBUG = 21,
  DT_TEXTREL = 22, DT_JMPREL = 23, DT_LOPROC = 0x70000000, DT_HIPROC = 0x7fffffff
}
 
enum  { GRP_COMDAT = 0x01 }
 
enum  ProgramFlags {
  PF_X = 0x01, PF_W = 0x02, PF_R = 0x04, PF_MASKPROC = 0xF0000000,
  PF_X = 0x01, PF_W = 0x02, PF_R = 0x04, PF_MASKPROC = 0xF0000000
}
 
enum  SegmentType {
  PT_NULL = 0x00, PT_LOAD = 0x01, PT_DYNAMIC = 0x02, PT_INTERP = 0x03,
  PT_NOTE = 0x04, PT_SHLIB = 0x05, PT_PHDR = 0x06, PT_LOPROC = 0x70000000,
  PT_HIPROC = 0x7fffffff, PT_NULL = 0x00, PT_LOAD = 0x01, PT_DYNAMIC = 0x02,
  PT_INTERP = 0x03, PT_NOTE = 0x04, PT_SHLIB = 0x05, PT_PHDR = 0x06,
  PT_LOPROC = 0x70000000, PT_HIPROC = 0x7fffffff
}
 
enum  REL_TYPE {
  R_386_NONE = 0, R_386_32 = 1, R_386_PC32 = 2, R_386_GOT32 = 3,
  R_386_PLT32 = 4, R_386_COPY = 5, R_386_GLOB_DAT = 6, R_386_JMP_SLOT = 7,
  R_386_RELATIVE = 8, R_386_GOTOFF = 9, R_386_GOTPC = 10, R_386_NONE = 0,
  R_386_32 = 1, R_386_PC32 = 2, R_386_GOT32 = 3, R_386_PLT32 = 4,
  R_386_COPY = 5, R_386_GLOB_DAT = 6, R_386_JMP_SLOT = 7, R_386_RELATIVE = 8,
  R_386_GOTOFF = 9, R_386_GOTPC = 10
}
 
enum  ST_TYPE {
  STT_NOTYPE = 0, STT_OBJECT = 1, STT_FUNC = 2, STT_SECTION = 3,
  STT_FILE = 4, STT_LOPROC = 13, STT_HIPROC = 15, STT_NOTYPE = 0,
  STT_OBJECT = 1, STT_FUNC = 2, STT_SECTION = 3, STT_FILE = 4,
  STT_LOPROC = 13, STT_HIPROC = 15
}
 
enum  ST_BIND {
  STB_LOCAL = 0, STB_GLOBAL = 1, STB_WEAK = 2, STB_LOPROC = 13,
  STB_HIPROC = 15, STB_LOCAL = 0, STB_GLOBAL = 1, STB_WEAK = 2,
  STB_LOPROC = 13, STB_HIPROC = 15
}
 
enum  { STN_UNDEF = 0 }
 
enum  SH_TYPE {
  SHT_NULL = 0, SHT_PROGBITS = 1, SHT_SYMTAB = 2, SHT_STRTAB = 3,
  SHT_RELA = 4, SHT_HASH = 5, SHT_DYNAMIC = 6, SHT_NOTE = 7,
  SHT_NOBITS = 8, SHT_REL = 9, SHT_SHLIB = 10, SHT_DYNSYM = 11,
  SHT_INIT_ARRAY = 12, SHT_FINI_ARRAY = 13, SHT_PREINIT_ARRAY = 16, SHT_GROUP = 17,
  SHT_SYMTAB_SHNDX = 18, SHT_LOPROC = 0x70000000, SHT_HIPROC = 0x7fffffff, SHT_LOUSER = 0x80000000,
  SHT_HIUSER = 0xffffffff, SHT_NULL = 0, SHT_PROGBITS = 1, SHT_SYMTAB = 2,
  SHT_STRTAB = 3, SHT_RELA = 4, SHT_HASH = 5, SHT_DYNAMIC = 6,
  SHT_NOTE = 7, SHT_NOBITS = 8, SHT_REL = 9, SHT_SHLIB = 10,
  SHT_DYNSYM = 11, SHT_INIT_ARRAY = 12, SHT_FINI_ARRAY = 13, SHT_PREINIT_ARRAY = 16,
  SHT_GROUP = 17, SHT_SYMTAB_SHNDX = 18, SHT_LOPROC = 0x70000000, SHT_HIPROC = 0x7fffffff,
  SHT_LOUSER = 0x80000000, SHT_HIUSER = 0xffffffff
}
 
enum  SH_FLAG {
  SHF_WRITE = 0x01, SHF_ALLOC = 0x02, SHF_EXECINSTR = 0x04, SHF_MERGE = 0x10,
  SHF_STRINGS = 0x20, SHF_INFO_LINK = 0x40, SHF_LINK_ORDER = 0x80, SHF_OS_NONCONFORMING = 0x100,
  SHF_GROUP = 0x200, SHF_TLS = 0x400, SHF_MASKOS = 0xff000000, SHF_AMD64_LARGE = 0x10000000,
  SHF_ORDERED = 0x40000000, SHF_EXCLUDE = 0x80000000, SHF_MASKPROC = 0xf0000000, SHF_WRITE = 0x01,
  SHF_ALLOC = 0x02, SHF_EXECINSTR = 0x04, SHF_MERGE = 0x10, SHF_STRINGS = 0x20,
  SHF_INFO_LINK = 0x40, SHF_LINK_ORDER = 0x80, SHF_OS_NONCONFORMING = 0x100, SHF_GROUP = 0x200,
  SHF_TLS = 0x400, SHF_MASKOS = 0xff000000, SHF_AMD64_LARGE = 0x10000000, SHF_ORDERED = 0x40000000,
  SHF_EXCLUDE = 0x80000000, SHF_MASKPROC = 0xf0000000
}
 
enum  SH_IDX {
  SHN_UNDEF = 0, SHN_LORESERVE = 0xff00, SHN_LOPROC = 0xff00, SHN_BEFORE = 0xff00,
  SHN_AFTER = 0xff01, SHN_HIPROC = 0xff1f, SHN_LOOS = 0xff20, SHN_HIOS = 0xff3f,
  SHN_ABS = 0xfff1, SHN_COMMON = 0xfff2, SHN_XINDEX = 0xffff, SHN_HIRESERVE = 0xffff,
  SHN_UNDEF = 0, SHN_LORESERVE = 0xff00, SHN_LOPROC = 0xff00, SHN_BEFORE = 0xff00,
  SHN_AFTER = 0xff01, SHN_HIPROC = 0xff1f, SHN_LOOS = 0xff20, SHN_HIOS = 0xff3f,
  SHN_ABS = 0xfff1, SHN_COMMON = 0xfff2, SHN_XINDEX = 0xffff, SHN_HIRESERVE = 0xffff
}
 

함수

int exec_elf_kernel (char *path)
 

상세한 설명

ELF 파일 로더를 구현한다.

ELF 포맷을 파싱해서 링크 하고 메모리에 적재해서 실행시킨다. NCKernel 은 ELF 포맷이기 때문에, 이 로더가 커널을 로딩한다.

작성자
Sung-jae Park nices.nosp@m.j@ni.nosp@m.cesj..nosp@m.com
날짜
2011-8-26
2011-8-26
작성자
Sung-jae Park nices.nosp@m.j@ni.nosp@m.cesj..nosp@m.com

매크로 문서화

#define ELF32_R_SYM (   i)    ((i) >> 8)
#define ELF32_R_TYPE (   i)    ((unsigned char)(i))
#define ELF32_SET_ST_TYPE (   v,
 
)    ((v) = ((v) & 0xF0) | ((i) & 0x0F))
#define ELF32_ST_BIND (   i)    ((i)>>4)
#define ELF32_ST_INFO (   b,
 
)    (((b) << 4) + ((t) & 0xf))
#define ELF32_ST_TYPE (   i)    ((i) & 0xf)
#define FIX_ALIGN (   ptr)
값:
do { \
(ptr) += (0x1000 - (((unsigned)(ptr)) & 0xFFF)); \
} while (0)
#define INVALID   (~0)
#define IS_RODATA (   flags)    (((flags) & SHF_ALLOC) == SHF_ALLOC && ((flags) & SHF_WRITE) != SHF_WRITE && ((flags) & SHF_EXECINSTR) != SHF_EXECINSTR)
#define IS_RWDATA (   flags)    (((flags) & SHF_ALLOC) == SHF_ALLOC && ((flags) & SHF_WRITE) == SHF_WRITE && ((flags) & SHF_EXECINSTR) != SHF_EXECINSTR)
#define IS_TEXT (   flags)    (((flags) & SHF_EXECINSTR) == SHF_EXECINSTR && ((flags) & SHF_ALLOC) == SHF_ALLOC)

타입정의 문서화

typedef unsigned long Elf32_Addr

32 bits 주소 표현

typedef unsigned short Elf32_Half

Word 단위 표현

typedef struct elf_header Elf32_Hdr
typedef unsigned long Elf32_Off

32 bits 오프셋 표헌

typedef struct SectionHeader Elf32_Shdr
typedef unsigned long Elf32_Sword

32 bits double word 표현

typedef unsigned long Elf32_Word

32 bits double word 표현

typedef void(* exec_entry)(char *args, char *envs)

열거형 타입 문서화

anonymous enum
열거형 멤버
GRP_COMDAT 
anonymous enum
열거형 멤버
STN_UNDEF 
enum DT_TAG
열거형 멤버
DT_NULL 
DT_NEEDED 
DT_PLTRELSZ 
DT_PLTGOT 
DT_HASH 
DT_STRTAB 
DT_SYMTAB 
DT_RELA 
DT_RELASZ 
DT_RELAENT 
DT_STRSZ 
DT_SYMENT 
DT_INIT 
DT_FINI 
DT_SONAME 
DT_RPATH 
DT_SYMBOLIC 
DT_REL 
DT_RELSZ 
DT_RELENT 
DT_PLTREL 
DT_DEBUG 
DT_TEXTREL 
DT_JMPREL 
DT_LOPROC 
DT_HIPROC 
DT_NULL 
DT_NEEDED 
DT_PLTRELSZ 
DT_PLTGOT 
DT_HASH 
DT_STRTAB 
DT_SYMTAB 
DT_RELA 
DT_RELASZ 
DT_RELAENT 
DT_STRSZ 
DT_SYMENT 
DT_INIT 
DT_FINI 
DT_SONAME 
DT_RPATH 
DT_SYMBOLIC 
DT_REL 
DT_RELSZ 
DT_RELENT 
DT_PLTREL 
DT_DEBUG 
DT_TEXTREL 
DT_JMPREL 
DT_LOPROC 
DT_HIPROC 
enum E_MACHINE
열거형 멤버
EM_NONE 

No machine.

EM_M32 

AT&T WE 32100.

EM_SPARC 

SPARC.

EM_386 

Intel 80386.

EM_68K 

Motolora 68000.

EM_88K 

Motorola 88000.

EM_860 

Intel 80860.

EM_MIPS 

MIPS RS3000.

EM_NONE 

No machine.

EM_M32 

AT&T WE 32100.

EM_SPARC 

SPARC.

EM_386 

Intel 80386.

EM_68K 

Motolora 68000.

EM_88K 

Motorola 88000.

EM_860 

Intel 80860.

EM_MIPS 

MIPS RS3000.

enum E_TYPE
열거형 멤버
ET_NONE 

No file type.

ET_REL 

Relocatable file.

ET_EXEC 

Executable file.

ET_DYN 

Shared object file.

ET_CORE 

Core file.

ET_LOPROC 

Processor-specific.

ET_HIPROC 

Processor-specific.

ET_NONE 

No file type.

ET_REL 

Relocatable file.

ET_EXEC 

Executable file.

ET_DYN 

Shared object file.

ET_CORE 

Core file.

ET_LOPROC 

Processor-specific.

ET_HIPROC 

Processor-specific.

enum E_VERSION
열거형 멤버
EV_NONE 
EV_CURRENT 
EV_NONE 
EV_CURRENT 
enum EFL_CLASS
열거형 멤버
ELFCLASSNONE 

Invalid class.

ELFCLASS32 

32-bit objects

ELFCLASS64 

64-bit objects

ELFCLASSNONE 

Invalid class.

ELFCLASS32 

32-bit objects

ELFCLASS64 

64-bit objects

enum EI_DATA
열거형 멤버
ELFDATANONE 

Invalid data encoding.

ELFDATA2LSB 
ELFDATA2MSB 
ELFDATANONE 

Invalid data encoding.

ELFDATA2LSB 
ELFDATA2MSB 
열거형 멤버
EI_MAG0 
EI_MAG1 
EI_MAG2 
EI_MAG3 

File identification.

EI_CLASS 

File claa.

EI_DATA 

Data encoding.

EI_VERSION 

File version.

EI_PAD 

Start of padding bytes.

EI_NIDENT 

Size of e_ident[].

EI_MAG0 
EI_MAG1 
EI_MAG2 
EI_MAG3 

File identification.

EI_CLASS 

File claa.

EI_DATA 

Data encoding.

EI_VERSION 

File version.

EI_PAD 

Start of padding bytes.

EI_NIDENT 

Size of e_ident[].

enum ELF_MAGIC
열거형 멤버
ELFMAG0 
ELFMAG1 
ELFMAG2 
ELFMAG3 
ELFMAG0 
ELFMAG1 
ELFMAG2 
ELFMAG3 
열거형 멤버
PF_X 
PF_W 
PF_R 
PF_MASKPROC 
PF_X 
PF_W 
PF_R 
PF_MASKPROC 
enum REL_TYPE
열거형 멤버
R_386_NONE 
R_386_32 
R_386_PC32 
R_386_GOT32 
R_386_PLT32 
R_386_COPY 
R_386_GLOB_DAT 
R_386_JMP_SLOT 
R_386_RELATIVE 
R_386_GOTOFF 
R_386_GOTPC 
R_386_NONE 
R_386_32 
R_386_PC32 
R_386_GOT32 
R_386_PLT32 
R_386_COPY 
R_386_GLOB_DAT 
R_386_JMP_SLOT 
R_386_RELATIVE 
R_386_GOTOFF 
R_386_GOTPC 
열거형 멤버
PT_NULL 

p_type

PT_LOAD 
PT_DYNAMIC 
PT_INTERP 
PT_NOTE 
PT_SHLIB 
PT_PHDR 
PT_LOPROC 
PT_HIPROC 
PT_NULL 

p_type

PT_LOAD 
PT_DYNAMIC 
PT_INTERP 
PT_NOTE 
PT_SHLIB 
PT_PHDR 
PT_LOPROC 
PT_HIPROC 
enum SH_FLAG
열거형 멤버
SHF_WRITE 
SHF_ALLOC 
SHF_EXECINSTR 
SHF_MERGE 
SHF_STRINGS 
SHF_INFO_LINK 
SHF_LINK_ORDER 
SHF_OS_NONCONFORMING 
SHF_GROUP 
SHF_TLS 
SHF_MASKOS 
SHF_AMD64_LARGE 
SHF_ORDERED 
SHF_EXCLUDE 
SHF_MASKPROC 
SHF_WRITE 
SHF_ALLOC 
SHF_EXECINSTR 
SHF_MERGE 
SHF_STRINGS 
SHF_INFO_LINK 
SHF_LINK_ORDER 
SHF_OS_NONCONFORMING 
SHF_GROUP 
SHF_TLS 
SHF_MASKOS 
SHF_AMD64_LARGE 
SHF_ORDERED 
SHF_EXCLUDE 
SHF_MASKPROC 
enum SH_IDX
열거형 멤버
SHN_UNDEF 
SHN_LORESERVE 
SHN_LOPROC 
SHN_BEFORE 
SHN_AFTER 
SHN_HIPROC 
SHN_LOOS 
SHN_HIOS 
SHN_ABS 
SHN_COMMON 
SHN_XINDEX 
SHN_HIRESERVE 
SHN_UNDEF 
SHN_LORESERVE 
SHN_LOPROC 
SHN_BEFORE 
SHN_AFTER 
SHN_HIPROC 
SHN_LOOS 
SHN_HIOS 
SHN_ABS 
SHN_COMMON 
SHN_XINDEX 
SHN_HIRESERVE 
enum SH_TYPE
열거형 멤버
SHT_NULL 
SHT_PROGBITS 
SHT_SYMTAB 
SHT_STRTAB 
SHT_RELA 
SHT_HASH 
SHT_DYNAMIC 
SHT_NOTE 
SHT_NOBITS 
SHT_REL 
SHT_SHLIB 
SHT_DYNSYM 
SHT_INIT_ARRAY 
SHT_FINI_ARRAY 
SHT_PREINIT_ARRAY 
SHT_GROUP 
SHT_SYMTAB_SHNDX 
SHT_LOPROC 
SHT_HIPROC 
SHT_LOUSER 
SHT_HIUSER 
SHT_NULL 
SHT_PROGBITS 
SHT_SYMTAB 
SHT_STRTAB 
SHT_RELA 
SHT_HASH 
SHT_DYNAMIC 
SHT_NOTE 
SHT_NOBITS 
SHT_REL 
SHT_SHLIB 
SHT_DYNSYM 
SHT_INIT_ARRAY 
SHT_FINI_ARRAY 
SHT_PREINIT_ARRAY 
SHT_GROUP 
SHT_SYMTAB_SHNDX 
SHT_LOPROC 
SHT_HIPROC 
SHT_LOUSER 
SHT_HIUSER 
enum ST_BIND
열거형 멤버
STB_LOCAL 
STB_GLOBAL 
STB_WEAK 
STB_LOPROC 
STB_HIPROC 
STB_LOCAL 
STB_GLOBAL 
STB_WEAK 
STB_LOPROC 
STB_HIPROC 
enum ST_TYPE
열거형 멤버
STT_NOTYPE 
STT_OBJECT 
STT_FUNC 
STT_SECTION 
STT_FILE 
STT_LOPROC 
STT_HIPROC 
STT_NOTYPE 
STT_OBJECT 
STT_FUNC 
STT_SECTION 
STT_FILE 
STT_LOPROC 
STT_HIPROC 

함수 문서화

int exec_elf_kernel ( char *  path)

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.: