source: anotherchoice/tags/jsp-1.4.4-full-UTF8/cfg/base/fc_bfd.cpp@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 7.8 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: fc_bfd.cpp,v 1.8 2003/12/15 07:32:13 takayuki Exp $
51 */
52
53
54#include "base/filecontainer.h"
55
56#include "base/message.h"
57
58#include "bfd.h"
59#include "libiberty.h"
60
61#include <string>
62#include <map>
63
64using namespace std;
65
66
67/*
68 * BFDを使ったファイルコンテナクラス
69 */
70class filecontainer_BFD : public filecontainer
71{
72protected:
73 bfd * object; //オブジェクト
74 map<string, asymbol *> symbol_table; //検索用ハッシュもどき
75 asymbol ** symbol_container;
76
77public:
78 filecontainer_BFD(void) throw();
79 ~filecontainer_BFD(void) throw();
80
81 virtual bool attach_module(const char *);
82 virtual bool change_endian(void * target, unsigned int size);
83 virtual bool load_contents(void * dest, unsigned long address, unsigned int size);
84 virtual unsigned long get_symbol_address(const char *);
85 virtual const char * get_architecture(void);
86
87} Instance_of_filecontainer_BFD;
88
89filecontainer_BFD::filecontainer_BFD(void) throw()
90{
91 bfd_init();
92
93 object = NULL;
94 symbol_table.clear();
95 symbol_container = NULL;
96 instance = this;
97}
98
99filecontainer_BFD::~filecontainer_BFD(void) throw()
100{
101 if(object != NULL)
102 bfd_close(object);
103}
104
105/*
106 * attach_module : 対象モジュールをアタッチする
107 */
108bool filecontainer_BFD::attach_module(const char * filename)
109{
110 char ** target_list;
111 asymbol ** symbols;
112 asymbol * sym;
113 int num_syms;
114 boolean result;
115 int i;
116
117 if(object != NULL)
118 bfd_close(object);
119 symbol_table.clear();
120
121 //モジュールオープン (読込用)
122 object = bfd_openr(filename, "default");
123
124 //ターゲット解決
125 target_list = (char **)bfd_target_list();
126 result = bfd_check_format_matches(object, bfd_object, &target_list);
127 if(result == 0)
128 ExceptionMessage("Internel error: BFD could not recognize the target file format.","内
129部エラー: BFDはファイルの読み出しに失敗しました").throwException();
130
131 //シンボルのハッシュもどき作成
132 symbols = (asymbol **)xmalloc( bfd_get_symtab_upper_bound(object) );
133 num_syms = bfd_canonicalize_symtab(object, symbols);
134
135 for(i=0;i<num_syms;i++)
136 {
137 sym = *(symbols+i);
138 if(sym != NULL && sym->name != NULL && *(sym->name) != '\x0')
139 symbol_table[string(sym->name)] = sym;
140 }
141
142 symbol_container = symbols;
143 return true;
144}
145
146bool filecontainer_BFD::change_endian(void * target, unsigned int size)
147{
148 //ホストはリトルと仮定
149 enum bfd_endian host_endian = BFD_ENDIAN_LITTLE;
150
151 char * top, * tail;
152
153 if(object == NULL)
154 return false;
155
156 if(object->xvec->byteorder == BFD_ENDIAN_UNKNOWN)
157 return false;
158
159/*
160 unsigned int __work = 0x1;
161 if( *(char *)__work == 0)
162 host_endian = BFD_ENDIAN_BIG;
163*/
164
165 if(object->xvec->byteorder == host_endian)
166 return true;
167
168 /*
169 * メインループ : bswapしないで、素直に書く
170 */
171
172 top = (char *)target;
173 tail = (char *)target+size -1;
174
175 while(top < tail)
176 {
177 *top ^= *tail, *tail ^= *top, *top ^= *tail;
178 top ++;
179 tail --;
180 }
181
182 return true;
183}
184
185
186bool filecontainer_BFD::load_contents(void * dest, unsigned long address, unsigned int size)
187{
188 struct sec * section;
189
190 if(object == 0)
191 return false;
192
193 //対象アドレスを保有するセクションを探す
194 section = object->sections;
195 while(section != 0)
196 {
197 if(address - (unsigned long)section->vma <= section->_raw_size
198 && (section->flags & (SEC_ALLOC|SEC_HAS_CONTENTS)) == (SEC_ALLOC|SEC_HAS_CONTENTS))
199 {
200 //読み出し
201 bfd_get_section_contents(object, section, dest, address - (unsigned long)section->vma, size);
202 return true;
203 }
204 section = section->next;
205 }
206
207 //どこにもない
208 ExceptionMessage("Internel error: Memory read with unmapped address","内
209部エラー; マップされてないアドレスを使ってメモリリードが行われました").throwException();
210
211 return false;
212}
213
214
215/*
216 * get_symbol_address : シンボル名からアドレス値を取得する
217 */
218unsigned long filecontainer_BFD::get_symbol_address(const char * symbol)
219{
220 map<string, asymbol *>::iterator scope;
221 string symbol_name;
222
223 if(object == 0)
224 ExceptionMessage("Not initialized","初期化されてません").throwException();
225
226 //シンボル名を生成する ("_"とかの処理)
227 if(object->xvec->symbol_leading_char != '\x0')
228 symbol_name += object->xvec->symbol_leading_char;
229 symbol_name += symbol;
230
231 scope = symbol_table.find(symbol_name);
232 if(scope == symbol_table.end())
233 return 0;
234 //Exception("Internal error: Unknown symbol [%s]","内
235部エラー: 不明なシンボル [%s]").format(symbol_name.c_str());
236
237 //Address = セクション内
238オフセット値 + セクションのVMA
239 return (*scope).second->value + (*scope).second->section->vma;
240}
241
242/*
243 * get_architecture : アーキテクチャ名の取得
244 */
245const char * filecontainer_BFD::get_architecture(void)
246{
247 if(object == NULL)
248 return "Unknown";
249
250 //とりあえずターゲット名を持ってアーキテクチャ名にしておく。
251 // #どうせバナーにしか使ってないしね 今のところ
252 return object->xvec->name;
253}
254
Note: See TracBrowser for help on using the repository browser.