📄 fc_bfd.cpp
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * 惧淡螟侯涪荚は·Free Software Foundation によって给山されている * GNU General Public License の Version 2 に淡揭されている掘凤か·笆 * 布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ * アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ * ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 * に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· * この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 * み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ * (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する * ことˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚を倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· * 塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ * ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい * かなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: fc_bfd.cpp,v 1.6 2002/04/05 08:48:31 takayuki Exp $ */#include "filecontainer.h"#include "except.h"#include "bfd.h"#include "libiberty.h"#include <string>#include <map>using namespace std;/* * BFDを蝗ったファイルコンテナクラス */class filecontainer_BFD : public filecontainer{protected: bfd * object; //オブジェクト map<string, asymbol *> symbol_table; //浮瑚脱ハッシュもどき asymbol ** symbol_container;public: filecontainer_BFD(void); ~filecontainer_BFD(void); virtual bool attach_module(const char *); virtual bool change_endian(void * target, unsigned int size); virtual bool load_contents(void * dest, unsigned long address, unsigned int size); virtual unsigned long get_symbol_address(const char *); virtual const char * get_architecture(void);} Instance_of_filecontainer_BFD;filecontainer_BFD::filecontainer_BFD(void){ bfd_init(); object = NULL; symbol_table.clear(); symbol_container = NULL; instance = this;}filecontainer_BFD::~filecontainer_BFD(void){ if(object != NULL) bfd_close(object);}/* * attach_module : 滦据モジュ〖ルをアタッチする */bool filecontainer_BFD::attach_module(const char * filename){ char ** target_list; asymbol ** symbols; asymbol * sym; int num_syms; boolean result; int i; if(object != NULL) bfd_close(object); symbol_table.clear(); //モジュ〖ルオ〖プン (粕哈脱) object = bfd_openr(filename, "default"); //タ〖ゲット豺疯 target_list = (char **)bfd_target_list(); result = bfd_check_format_matches(object, bfd_object, &target_list); if(result == 0) Exception("Internel error: BFD could not recognize the target file format.","柒婶エラ〖: BFDはファイルの粕み叫しに己窃しました"); //シンボルのハッシュもどき侯喇 symbols = (asymbol **)xmalloc( bfd_get_symtab_upper_bound(object) ); num_syms = bfd_canonicalize_symtab(object, symbols); for(i=0;i<num_syms;i++) { sym = *(symbols+i); if(sym != NULL && sym->name != NULL && *(sym->name) != '\x0') symbol_table[string(sym->name)] = sym; } symbol_container = symbols; return true;}bool filecontainer_BFD::change_endian(void * target, unsigned int size){ //ホストはリトルと簿年 enum bfd_endian host_endian = BFD_ENDIAN_LITTLE; char * top, * tail; if(object == NULL) return false; if(object->xvec->byteorder == BFD_ENDIAN_UNKNOWN) return false;/* unsigned int __work = 0x1; if( *(char *)__work == 0) host_endian = BFD_ENDIAN_BIG;*/ if(object->xvec->byteorder == host_endian) return true; /* * メインル〖プ : bswapしないで、燎木に今く */ top = (char *)target; tail = (char *)target+size -1; while(top < tail) { *top ^= *tail, *tail ^= *top, *top ^= *tail; top ++; tail --; } return true;}bool filecontainer_BFD::load_contents(void * dest, unsigned long address, unsigned int size){ struct sec * section; if(object == 0) return false; //滦据アドレスを瘦铜するセクションを玫す section = object->sections; while(section != 0) { if(address - (unsigned long)section->vma <= section->_raw_size && (section->flags & (SEC_ALLOC|SEC_HAS_CONTENTS)) == (SEC_ALLOC|SEC_HAS_CONTENTS)) { //粕み叫し bfd_get_section_contents(object, section, dest, address - (unsigned long)section->vma, size); return true; } section = section->next; } //どこにもない Exception("Internel error: Memory read with unmapped address","柒婶エラ〖; マップされてないアドレスを蝗ってメモリリ〖ドが乖われました"); return false;}/* * get_symbol_address : シンボル叹からアドレス猛を艰评する */unsigned long filecontainer_BFD::get_symbol_address(const char * symbol){ map<string, asymbol *>::iterator scope; string symbol_name; if(object == 0) Exception("Not initialized","介袋步されてません"); //シンボル叹を栏喇する ("_"とかの借妄) if(object->xvec->symbol_leading_char != '\x0') symbol_name += object->xvec->symbol_leading_char; symbol_name += symbol; scope = symbol_table.find(symbol_name); if(scope == symbol_table.end()) return 0; //Exception("Internal error: Unknown symbol [%s]","柒婶エラ〖: 稍汤なシンボル [%s]").format(symbol_name.c_str()); //Address = セクション柒オフセット猛 + セクションのVMA return (*scope).second->value + (*scope).second->section->vma;}/* * get_architecture : ア〖キテクチャ叹の艰评 */const char * filecontainer_BFD::get_architecture(void){ if(object == NULL) return "Unknown"; //とりあえずタ〖ゲット叹を积ってア〖キテクチャ叹にしておく。 // #どうせバナ〖にしか蝗ってないしね 海のところ return object->xvec->name;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -