/*	
 *	clipelf.h
 *
 *	Executable and Linkable Format (ELF)
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2010 Naoyuki Sawa
 *
 *	* Sat Jan 09 00:08:02 JST 2010 Naoyuki Sawa
 *	- 1st リリース。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_ELF_H__
#define __CLIP_ELF_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/*--------------------------------------------------------------------------*/
//
//	このヘッダファイルでは、ELFファイルの構造を定義します。
//
//	実行可能形式のELFファイルをロードする処理は単純なので、関数を用意しませんでした。
//	ロード処理は、アプリケーション毎に実装してください。
//
//	以下に、S1C17エミュレータにELFファイルをロードする、サンプルコードを示します。
//	実行可能形式のELFファイルをロードするだけの処理には、Elf32_Shdrは必要ありません。
//
//	const Elf32_Ehdr* ehdr;
//	const Elf32_Phdr* phdr;
//	int i;
//	/* ELFファイルを開く */
//	ehdr = file_defrag("sample.elf", NULL);
//	/* マジックナンバーを確認する */
//	if(*(int*)ehdr->e_ident != 0x464C457F) {
//		DIE();
//	}
//	/* 各セグメントについて… */
//	for(i = 0; i < ehdr->e_phnum; i++) {
//		/* セグメント情報を取得する */
//		phdr = (Elf32_Phdr*)((char*)ehdr + ehdr->e_phoff + ehdr->e_phentsize * i);
//		/* セグメントをロードする。 */
//		if((phdr->p_type == 1/*PT_LOAD*/) && phdr->p_filesz) { /* 実体が無い場合(.bss)はロード不要 */
//			s1c17_flash_load(phdr->p_paddr/*LMA*/, (char*)ehdr + phdr->p_offset, phdr->p_filesz);
//		}
//	}
//
/*--------------------------------------------------------------------------*/

/****************************************************************************
 *	
 ****************************************************************************/

/* ELF Header */
typedef struct {
	unsigned char	e_ident[16];	/* マジックナンバー等 ([0...3] = 0x464C457F) */
	unsigned short	e_type;		/* オブジェクトファイルタイプ */
	unsigned short	e_machine;	/* アーキテクチャ */
	unsigned	e_version;	/* ファイルバージョン */
	unsigned	e_entry;	/* プロセスを開始する仮想アドレス */
	unsigned	e_phoff;	/* プログラムヘッダテーブルのファイルオフセット */
	unsigned	e_shoff;	/* セクションヘッダテーブルのファイルオフセット */
	unsigned	e_flags;	/* プロセッサに固有なフラグ */
	unsigned short	e_ehsize;	/* ELFヘッダのサイズ */
	unsigned short	e_phentsize;	/* プログラムヘッダテーブル中のエントリ1個のサイズ */
	unsigned short	e_phnum;	/* プログラムヘッダテーブル中のエントリの個数 */
	unsigned short	e_shentsize;	/* セクションヘッダテーブル中のエントリ1個のサイズ */
	unsigned short	e_shnum;	/* セクションヘッダテーブル中のエントリの個数 */
	unsigned short	e_shstrndx;	/* セクション名文字列テーブルのセクションインデックス */
} Elf32_Ehdr;

/* Program Header */
typedef struct {
	unsigned	p_type;		/* セグメントの種類 */
	unsigned	p_offset;	/* セグメントのファイルオフセット */
	unsigned	p_vaddr;	/* セグメントの仮想アドレス (VMA) */
	unsigned	p_paddr;	/* セグメントの物理アドレス (LMA) */
	unsigned	p_filesz;	/* セグメントのファイルイメージのサイズ */
	unsigned	p_memsz;	/* セグメントのメモリイメージのサイズ */
	unsigned	p_flags;	/* セグメントの属性を表すフラグ */
	unsigned	p_align;	/* メモリ中、および、ファイル中でセグメントが整列すべき値 */
} Elf32_Phdr;

/* Section Header */
typedef struct {
	unsigned	sh_name;	/* セクション名のインデックス */
	unsigned	sh_type;	/* セクションの内容と意味 */
	unsigned	sh_flags;	/* 様々な属性を記述するフラグ */
	unsigned	sh_addr;	/* セクションのアドレス */
	unsigned	sh_offset;	/* セクションのファイルオフセット */
	unsigned	sh_size;	/* セクションのサイズ */
	unsigned	sh_link;	/* セクションヘッダテーブルインデックスリンク */
	unsigned	sh_info;	/* 追加情報 */
	unsigned	sh_addralign;	/* アドレス境界の制約 */
	unsigned	sh_entsize;	/* 固定長エントリのテーブルを持つ場合、各エントリのサイズ */
} Elf32_Shdr;

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /*__CLIP_ELF_H__*/
