Author: arty Date: Fri Mar 7 07:53:55 2008 New Revision: 32591
URL: http://svn.reactos.org/svn/reactos?rev=3D32591&view=3Drev Log: Fix us back up to use PE-COFF again. This is getting ridiculous, but I now really understand everything, and freeldr moved the image mapping code to a common area.
Added: trunk/tools/RosBE/RosBE-PPC/elfpe/coff.cpp (with props) trunk/tools/RosBE/RosBE-PPC/elfpe/coff.h (with props) trunk/tools/RosBE/RosBE-PPC/elfpe/exports.cpp (with props) trunk/tools/RosBE/RosBE-PPC/elfpe/exports.h (with props) trunk/tools/RosBE/RosBE-PPC/elfpe/imports.cpp (with props) trunk/tools/RosBE/RosBE-PPC/elfpe/imports.h (with props) trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.cpp (with props) trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.h (with props) trunk/tools/RosBE/RosBE-PPC/elfpe/section.h (with props) Modified: trunk/tools/RosBE/RosBE-PPC/elfpe/Makefile trunk/tools/RosBE/RosBE-PPC/elfpe/elfpe.cpp trunk/tools/RosBE/RosBE-PPC/elfpe/header.cpp trunk/tools/RosBE/RosBE-PPC/elfpe/header.h trunk/tools/RosBE/RosBE-PPC/elfpe/objectfile.cpp trunk/tools/RosBE/RosBE-PPC/elfpe/objectfile.h trunk/tools/RosBE/RosBE-PPC/elfpe/util.cpp trunk/tools/RosBE/RosBE-PPC/elfpe/util.h
Modified: trunk/tools/RosBE/RosBE-PPC/elfpe/Makefile URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/M= akefile?rev=3D32591&r1=3D32590&r2=3D32591&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/Makefile (original) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/Makefile Fri Mar 7 07:53:55 2008 @@ -1,6 +1,6 @@ elfpe: argparse.cpp argparse.h header.cpp header.h \ objectfile.cpp objectfile.h util.cpp util.h pedef.h \ - elfpe.cpp + elfpe.cpp reloc.cpp coff.cpp exports.cpp imports.cpp g++ -g -o $@ $^ -lelf =
clean:
Added: trunk/tools/RosBE/RosBE-PPC/elfpe/coff.cpp URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/c= off.cpp?rev=3D32591&view=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/coff.cpp (added) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/coff.cpp Fri Mar 7 07:53:55 2008 @@ -1,0 +1,42 @@ +#include "coff.h" + +PECoffExecutable::PECoffExecutable +(const ElfObjectFile &elf, const std::string &file, uint32_t filealign) + : elf(elf), tempFile(file), filealign(filealign) +{ + int i; + FILE *f =3D fopen(tempFile.c_str(), "wb"); + if (!f) return; + + // Write PE Header + const ElfObjectFile::Section §ion =3D *elf.getNamedSection(".pehea= der"); + fwrite(section.getSectionData(), 1, section.logicalSize(), f); + =
+ // Write out sections + uint32_t physSize; + uint32_t bytes =3D 0; + + for (i =3D 1; i < elf.getNumSections(); i++) + { + const ElfObjectFile::Section §ion =3D elf.getSection(i); + if (section.getName() =3D=3D ".peheader") continue; + if (section.getType() !=3D SHT_NOBITS && section.getFlags() & SHF_ALLOC) + { + physSize =3D roundup(section.logicalSize(), filealign); +#if 0 + printf("P %08x:%08x %s\n", =
+ (int)ftell(f), + section.logicalSize(), =
+ section.getName().c_str()); +#endif + bytes =3D fwrite(section.getSectionData(), 1, section.logicalSize(), = f); + while(bytes++ < physSize) fputc(0, f); + } + } + fclose(f); +} + +void PECoffExecutable::Write(const std::string &resultFile) +{ + rename(tempFile.c_str(), resultFile.c_str()); +}
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/coff.cpp ---------------------------------------------------------------------------= --- svn:eol-style =3D native
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/coff.cpp ---------------------------------------------------------------------------= --- svn:executable =3D *
Added: trunk/tools/RosBE/RosBE-PPC/elfpe/coff.h URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/c= off.h?rev=3D32591&view=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/coff.h (added) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/coff.h Fri Mar 7 07:53:55 2008 @@ -1,0 +1,22 @@ +#ifndef COMPDVR_COFF_H +#define COMPDVR_COFF_H + +#include <vector> +#include <utility> +#include "pedef.h" +#include "util.h" +#include "objectfile.h" +#include "section.h" + +class PECoffExecutable { +public: + PECoffExecutable(const ElfObjectFile &elf, const std::string &tmpFile,= uint32_t filealign); + void Write(const std::string &resultFile); + +private: + const ElfObjectFile &elf; + std::string tempFile; + uint32_t filealign; +}; + +#endif//COMPDVR_COFF_H
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/coff.h ---------------------------------------------------------------------------= --- svn:eol-style =3D native
Modified: trunk/tools/RosBE/RosBE-PPC/elfpe/elfpe.cpp URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/e= lfpe.cpp?rev=3D32591&r1=3D32590&r2=3D32591&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/elfpe.cpp (original) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/elfpe.cpp Fri Mar 7 07:53:55 2008 @@ -12,8 +12,13 @@ #include "objectfile.h" #include "header.h" #include "argparse.h" +#include "reloc.h" +#include "coff.h" +#include "exports.h" +#include "imports.h" =
#define TYPE_PEHEADER (SHT_LOOS + 1) +#define TYPE_PERELOC (SHT_LOOS + 2) =
int execute_command( bool verbose, const std::vectorstd::string &args ) { @@ -55,6 +60,26 @@ } } args.insert(args.begin(), the_definition + "=3D" + body); +} + +std::vector<uint8_t> =
+ProcessRelocSections +(const ElfObjectFile &eof, =
+ uint32_t imageBase, + const std::vector<section_mapping_t> &rvas) +{ + std::vector<uint8_t> relocData; + uint32_t relocAddr =3D (uint32_t)-1; + int i, j; + for (i =3D 1; i < eof.getNumSections(); i++) + { + const ElfObjectFile::Section §ion =3D eof.getSection(i); + if (section.getType() =3D=3D SHT_REL || + section.getType() =3D=3D SHT_RELA) + SingleRelocSection(eof, section, rvas, relocData, imageBase, r= elocAddr); + } + AddReloc(relocData, 0, relocAddr, 0, 0); + return relocData; } =
int main( int argc, char **argv ) { @@ -100,6 +125,11 @@ if(entry_point.size() && entry_point[0] =3D=3D '_') { entry_point =3D entry_point.substr(1); + } + size_t at =3D entry_point.find('@'); + if (at !=3D std::string::npos) + { + entry_point =3D entry_point.substr(0, at); } if( !compile_only ) { @@ -142,7 +172,7 @@ if( verbose ) gcc_args_str.insert(gcc_args_str.begin(),"-v"); if (!compile_only) { - if( is_dll ) gcc_args_str.insert(gcc_args_str.begin(), "-Wl,-r"); + //gcc_args_str.insert(gcc_args_str.begin(), "-Wl,-r"); gcc_args_str.insert(gcc_args_str.begin(), "-Wl,-q"); gcc_args_str.insert(gcc_args_str.begin(), "-Wl,-d"); gcc_args_str.insert(gcc_args_str.begin(), "-Wl,--start-group"); @@ -160,30 +190,56 @@ } if (!compile_only) gcc_args_str.insert(gcc_args_str.end(), "-Wl,--end-= group"); =
+ std::vector<section_mapping_t> sectionRvas; if ( !(status =3D execute_command( verbose, gcc_args_str )) && !compil= e_only && mkheader ) { /* Ok fixup the elf object file */ ElfObjectFile eof(output_file); + if(!eof) exit(1); =
+ =
+ uint32_t imageSize; const ElfObjectFile::Symbol *entry_sym; - - if(!eof) exit(1); - entry_sym =3D eof.getNamedSymbol(entry_point); - + =
+ /* This computes the section RVAs */ ElfPeHeader header - (strtoul(image_base.c_str(), 0, 0), - strtoul(section_align.c_str(), 0, 0), - strtoul(file_align.c_str(), 0, 0), - entry_sym, - 0x10000, - 0x100000, - 0x10000, - 0x100000, - atoi(subsystem.c_str()), - is_dll, - &eof); - - eof.addSection(".peheader", header.getData(), TYPE_PEHEADER); + (strtoul(image_base.c_str(), 0, 0), + strtoul(section_align.c_str(), 0, 0), + strtoul(file_align.c_str(), 0, 0), + entry_sym, + 0x10000, + 0x100000, + 0x10000, + 0x100000, + atoi(subsystem.c_str()), + is_dll, + &eof); + =
+ // Get base section layout + imageSize =3D header.getSectionRvas(sectionRvas); + + // Add relocation info + std::vector<uint8_t> relocSection =3D =
+ ProcessRelocSections + (eof, strtoul(image_base.c_str(), 0, 0), sectionRvas); + eof.addSection(".reloc", relocSection, SHT_PROGBITS); + eof.update(); + + // Recompute RVAs after adding reloc section + imageSize =3D header.getSectionRvas(sectionRvas); + header.createHeaderSection(sectionRvas, imageSize); + eof.addSection(".peheader", header.getData(), SHT_PROGBITS); + eof.update(); + + // Fixup exports + ExportFixup(eof, sectionRvas); + + // Fixup imports + ImportFixup(eof, sectionRvas); + eof.update(); + + PECoffExecutable cof(eof, output_file + ".tmp", strtoul(file_align= .c_str(), 0, 0)); + cof.Write(output_file); } =
return status;
Added: trunk/tools/RosBE/RosBE-PPC/elfpe/exports.cpp URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/e= xports.cpp?rev=3D32591&view=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/exports.cpp (added) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/exports.cpp Fri Mar 7 07:53:55 2008 @@ -1,0 +1,46 @@ +#include "exports.h" +#include "objectfile.h" +#include "section.h" + +void ExportFixup +(ElfObjectFile &eof, + const std::vector<section_mapping_t> &mapping) +{ + const ElfObjectFile::Section *exportSect =3D eof.getNamedSection(".eda= ta"); + if (!exportSect) return; + uint8_t *exportTable =3D exportSect->getSectionData(); + // Fixup the words of the export directory + uint8_t *exportTarget =3D exportTable; + uint32_t exportRva =3D FindRVA(mapping, exportSect->getNumber()); + + uint32_t nameRva, ordinalBase, numberOfAddress, numberOfNames, address= Rva, + namePtrRva, ordinalTableRva; + int i; + + le32write_postinc(exportTarget, be32read(exportTarget)); + le32write_postinc(exportTarget, be32read(exportTarget)); + le16write_postinc(exportTarget, be16read(exportTarget)); + le16write_postinc(exportTarget, be16read(exportTarget)); + le32write_postinc(exportTarget, (nameRva =3D be32read(exportTarget))); + le32write_postinc(exportTarget, (ordinalBase =3D be32read(exportTarget= ))); + le32write_postinc(exportTarget, (numberOfAddress =3D be32read(exportTa= rget))); + le32write_postinc(exportTarget, (numberOfNames =3D be32read(exportTarg= et))); + le32write_postinc(exportTarget, (addressRva =3D be32read(exportTarget)= )); + le32write_postinc(exportTarget, (namePtrRva =3D be32read(exportTarget)= )); + le32write_postinc(exportTarget, (ordinalTableRva =3D be32read(exportTa= rget))); + =
+ // Address Table + exportTarget =3D exportTable + addressRva - exportRva; + for (i =3D 0; i < numberOfAddress; i++) + le32write_postinc(exportTarget, be32read(exportTarget)); + =
+ // Name table + exportTarget =3D exportTable + namePtrRva - exportRva; + for (i =3D 0; i < numberOfNames; i++) + le32write_postinc(exportTarget, be32read(exportTarget)); + + // Ordinal table + exportTarget =3D exportTable + ordinalTableRva - exportRva; + for (i =3D 0; i < numberOfAddress; i++) + le16write_postinc(exportTarget, be16read(exportTarget)); +}
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/exports.cpp ---------------------------------------------------------------------------= --- svn:eol-style =3D native
Added: trunk/tools/RosBE/RosBE-PPC/elfpe/exports.h URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/e= xports.h?rev=3D32591&view=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/exports.h (added) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/exports.h Fri Mar 7 07:53:55 2008 @@ -1,0 +1,14 @@ +#ifndef COMPDVR_EXPORTS_H +#define COMPDVR_EXPORTS_H + +#include <vector> +#include <utility> +#include "pedef.h" +#include "util.h" +#include "objectfile.h" +#include "section.h" + +void ExportFixup +(ElfObjectFile &eof, const std::vector<section_mapping_t> &mapping); + +#endif//COMPDVR_EXPORTS_H
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/exports.h ---------------------------------------------------------------------------= --- svn:eol-style =3D native
Modified: trunk/tools/RosBE/RosBE-PPC/elfpe/header.cpp URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/h= eader.cpp?rev=3D32591&r1=3D32590&r2=3D32591&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/header.cpp (original) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/header.cpp Fri Mar 7 07:53:55 2008 @@ -16,6 +16,7 @@ ElfObjectFile *eof) : imagebase(imagebase), sectionalign(sectionalign), + filealign(filealign), stackreserve(stackreserve), stackcommit(stackcommit), heapreserve(heapreserve), @@ -25,19 +26,15 @@ eof(eof) { data.resize(computeSize()); - createHeaderSection(); } =
int ElfPeHeader::computeSize() const { - return sectionalign; /* We'll compute it for real later */ -} - -void ElfPeHeader::createHeaderSection() -{ - std::vector<section_mapping_t> sectionRvaSet; - uint32_t imageSize =3D getSectionRvas(sectionRvaSet); - + return roundup(0x80 + 0x200, filealign); /* We'll compute it for real = later */ +} + +void ElfPeHeader::createHeaderSection(const std::vector<section_mapping_t>= §ionRvaSet, uint32_t imageSize) +{ data[0] =3D 'M'; data[1] =3D 'Z'; uint8_t *dataptr =3D &data[0x3c]; uint32_t coffHeaderSize, optHeaderSizeMember; @@ -88,7 +85,7 @@ le32pwrite_postinc(dataptr, getResourceInfo(sectionRvaSet)); le32pwrite_postinc(dataptr, getExceptionInfo()); le32pwrite_postinc(dataptr, getSecurityInfo()); - le32pwrite_postinc(dataptr, getRelocInfo()); + le32pwrite_postinc(dataptr, getRelocInfo(sectionRvaSet)); le32pwrite_postinc(dataptr, getDebugInfo()); le32pwrite_postinc(dataptr, getDescrInfo()); le32pwrite_postinc(dataptr, getMachInfo()); @@ -101,28 +98,37 @@ // size, but leaving out the other info. We write the section name // truncated into the name field and leave the section id in the // physical address bit + + uint32_t paddr =3D computeSize(); for (int i =3D 0; i < sectionRvaSet.size(); i++) { section_mapping_t mapping =3D sectionRvaSet[i]; const ElfObjectFile::Section *section =3D mapping.section; std::string name =3D section->getName(); uint32_t size =3D section->logicalSize(); + uint32_t psize =3D =
+ section->getType() =3D=3D SHT_NOBITS ? 0 : roundup(size, filealign); uint32_t rva =3D mapping.rva; for (int j =3D 0; j < 8; j++) { *dataptr++ =3D j < name.size() ? name[j] : '\000'; } + +#if 0 + printf("V %08x:%08x P %08x:%08x %s\n", + rva, size, paddr, psize, name.c_str()); +#endif + le32write_postinc(dataptr, size); le32write_postinc(dataptr, rva); - le32write_postinc(dataptr, size); - // Note: we put the index in the offset slot so we can find the - // real offset later in the loader - le32write_postinc(dataptr, sectionRvaSet[i].index); + le32write_postinc(dataptr, psize); + le32write_postinc(dataptr, paddr); le32write_postinc(dataptr, 0); le32write_postinc(dataptr, 0); le32write_postinc(dataptr, 0); // XXX Figure out the real flags le32write_postinc(dataptr, IMAGE_SCN_CNT_CODE); + paddr +=3D psize; } } =
@@ -132,14 +138,17 @@ { uint32_t start =3D computeSize(); uint32_t limit =3D start; - for(int i =3D 0; i < eof->getNumSections(); i++) { + + rvas.clear(); + + for(int i =3D 1; i < eof->getNumSections(); i++) { { const ElfObjectFile::Section § =3D eof->getSection(i); if(sect.getFlags() & SHF_ALLOC) { limit =3D roundup(start + sect.logicalSize(), sectionalign); #if 0 - fprintf(stderr, "rva[%02d:%s] =3D (%x %x %d)\n", - rvas.size(), sect.getName().c_str(), §, start, i); + fprintf(stderr, "rva[%02d:-%20s] =3D (%08x %08x %08x %d)\n", + rvas.size(), sect.getName().c_str(), start, sect.getStartRva(), sect.lo= gicalSize(), i); #endif rvas.push_back(section_mapping_t(§, start, i)); } @@ -198,9 +207,9 @@ return std::make_pair(0,0); } =
-u32pair_t ElfPeHeader::getRelocInfo() const -{ - return std::make_pair(0,0); +u32pair_t ElfPeHeader::getRelocInfo(const std::vector<section_mapping_t> &= mapping) const +{ + return getNamedSectionInfo(eof, mapping, ".reloc"); } =
u32pair_t ElfPeHeader::getDebugInfo() const
Modified: trunk/tools/RosBE/RosBE-PPC/elfpe/header.h URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/h= eader.h?rev=3D32591&r1=3D32590&r2=3D32591&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/header.h (original) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/header.h Fri Mar 7 07:53:55 2008 @@ -6,18 +6,7 @@ #include "pedef.h" #include "util.h" #include "objectfile.h" - -typedef struct section_mapping_t { - const ElfObjectFile::Section *section; - uint32_t rva; - int index; - - section_mapping_t - (const ElfObjectFile::Section *sect, uint32_t rva, int index) : - section(sect), rva(rva), index(index) { } - section_mapping_t(const section_mapping_t &other) : - section(other.section), rva(other.rva), index(other.index) { } -} section_mapping_t; +#include "section.h" =
class ElfPeHeader { public: @@ -34,10 +23,10 @@ bool dll, ElfObjectFile *eof); const ElfObjectFile::secdata_t &getData() const; + uint32_t getSectionRvas(std::vector<section_mapping_t> &rvas) const; + void createHeaderSection(const std::vector<section_mapping_t> &rvas, u= int32_t imageSize); =
private: - void createHeaderSection(); - uint32_t getSectionRvas(std::vector<section_mapping_t> &rvas) const; uint32_t getEntryPoint(const std::vector<section_mapping_t> &rvas, con= st ElfObjectFile::Symbol *entry) const; int computeSize() const; int getExeFlags() const { return 0; } @@ -47,7 +36,7 @@ u32pair_t getResourceInfo(const std::vector<section_mapping_t> &rvas) = const; u32pair_t getExceptionInfo() const; u32pair_t getSecurityInfo() const; - u32pair_t getRelocInfo() const; + u32pair_t getRelocInfo(const std::vector<section_mapping_t> &rvas) con= st; u32pair_t getDebugInfo() const; u32pair_t getDescrInfo() const; u32pair_t getMachInfo() const;
Added: trunk/tools/RosBE/RosBE-PPC/elfpe/imports.cpp URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/i= mports.cpp?rev=3D32591&view=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/imports.cpp (added) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/imports.cpp Fri Mar 7 07:53:55 2008 @@ -1,0 +1,43 @@ +#include "imports.h" +#include "objectfile.h" +#include "section.h" + +void ImportFixup +(ElfObjectFile &eof, + const std::vector<section_mapping_t> &mapping) +{ + const ElfObjectFile::Section *importSect =3D eof.getNamedSection(".ida= ta"); + if (!importSect) return; + uint8_t *importTable =3D importSect->getSectionData(); + uint8_t *importTarget =3D importTable, *tableAddr, *hintName; + uint32_t importRva =3D FindRVA(mapping, importSect->getNumber()); + uint32_t tableRva, iatRva, hintNameEntry; + + do + { + le32write_postinc(importTarget, (tableRva =3D be32read(importTarge= t))); + le32write_postinc(importTarget, be32read(importTarget)); + le32write_postinc(importTarget, be32read(importTarget)); + le32write_postinc(importTarget, be32read(importTarget)); + le32write_postinc(importTarget, (iatRva =3D be32read(importTarget)= )); + + if (!tableRva) return; + + // Rewrite the import lookup table + tableAddr =3D importTable + tableRva - importRva; + while (hintNameEntry =3D be32read(tableAddr)) + { + le32write_postinc(tableAddr, hintNameEntry); + // Rewrite the hint/name element + //hintName =3D importTable + hintNameEntry - importRva; + //le16write(hintName, be16read(hintName)); + } + + // Do the second address table + tableAddr =3D importTable + iatRva - importRva; + while (hintNameEntry =3D be32read(tableAddr)) + { + le32write_postinc(tableAddr, hintNameEntry); + } + } while(1); +}
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/imports.cpp ---------------------------------------------------------------------------= --- svn:eol-style =3D native
Added: trunk/tools/RosBE/RosBE-PPC/elfpe/imports.h URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/i= mports.h?rev=3D32591&view=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/imports.h (added) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/imports.h Fri Mar 7 07:53:55 2008 @@ -1,0 +1,14 @@ +#ifndef COMPDVR_IMPORTS_H +#define COMPDVR_IMPORTS_H + +#include <vector> +#include <utility> +#include "pedef.h" +#include "util.h" +#include "objectfile.h" +#include "section.h" + +void ImportFixup +(ElfObjectFile &eof, const std::vector<section_mapping_t> &mapping); + +#endif//COMPDVR_IMPORTS_H
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/imports.h ---------------------------------------------------------------------------= --- svn:eol-style =3D native
Modified: trunk/tools/RosBE/RosBE-PPC/elfpe/objectfile.cpp URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/o= bjectfile.cpp?rev=3D32591&r1=3D32590&r2=3D32591&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/objectfile.cpp (original) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/objectfile.cpp Fri Mar 7 07:53:55 20= 08 @@ -3,43 +3,71 @@ #include "util.h" #include "objectfile.h" =
-ElfObjectFile::ElfObjectFile(const std::string &filename) : fd(-1) +ElfObjectFile::ElfObjectFile(const std::string &filename) : fd(-1), filena= me(filename) { - Elf_Scn *s =3D 0; + init(); +} + +void ElfObjectFile::init() +{ Elf32_Ehdr *ehdr; - Section *sect; + elfHeader =3D NULL; + lastStr =3D NULL; + fd =3D open(filename.c_str(), O_RDWR, 0); if(fd >=3D 0) { - if(elf_version(EV_CURRENT) =3D=3D EV_NONE) { - // Old version - return; - } - elfHeader =3D elf_begin(fd, ELF_C_RDWR, (Elf*)0); - if(elf_kind(elfHeader) !=3D ELF_K_ELF) { - // Didn't get an elf object file + if(elf_version(EV_CURRENT) =3D=3D EV_NONE) { + // Old version + return; + } + elfHeader =3D elf_begin(fd, ELF_C_RDWR, (Elf*)0); + if(elf_kind(elfHeader) !=3D ELF_K_ELF) { + // Didn't get an elf object file elfHeader =3D NULL; - return; - } - ehdr =3D elf32_getehdr(elfHeader); - shnum =3D ehdr->e_shnum; - phnum =3D ehdr->e_phnum; - shstrndx =3D ehdr->e_shstrndx; - /* Populate section table */ - for(size_t i =3D 0; i < shnum; i++) - { - s =3D elf_nextscn(elfHeader, s); - if(!s) break; - sect =3D new Section(*this, i, s); - sections.push_back(sect); - sections_by_name.insert(std::make_pair(sect->getName(), sect)); - } + return; + } =
- populateSymbolTable(); + ehdr =3D elf32_getehdr(elfHeader); + phnum =3D ehdr->e_phnum; + shstrndx =3D ehdr->e_shstrndx; + + populateSections(); + populateSymbolTable(); + } +} + +void ElfObjectFile::populateSections() +{ + Section *sect; + Elf32_Ehdr *ehdr; + Elf_Scn *s =3D 0; + + ehdr =3D elf32_getehdr(elfHeader); + shnum =3D ehdr->e_shnum; + =
+ /* ABS section */ + sections.clear(); + sections_by_name.clear(); + sections.push_back(new Section(*this, 0, NULL)); + =
+ /* Populate section table */ + for(size_t i =3D 1; i < shnum; i++) + { + s =3D elf_nextscn(elfHeader, s); + if(!s) break; + sect =3D new Section(*this, i, s); + sections.push_back(sect); + sections_by_name.insert(std::make_pair(sect->getName(), sect)); } } =
ElfObjectFile::~ElfObjectFile() +{ + finalize(); +} + +void ElfObjectFile::finalize() { if(elfHeader) elf_end(elfHeader); if(fd >=3D 0) close(fd); @@ -55,7 +83,10 @@ Elf32_Sym *sym; Symbol *ourSym; =
- for( i =3D 0; i < getNumSections(); i++ ) { + symbols.clear(); + symbols_by_name.clear(); + + for( i =3D 1; i < getNumSections(); i++ ) { type =3D getSection(i).getType(); link =3D getSection(i).getLink(); if( (type =3D=3D SHT_SYMTAB) || (type =3D=3D SHT_DYNSYM) ) { @@ -85,7 +116,7 @@ /* Create data for the new section */ Elf_Data *edata =3D elf_newdata(newsect), *strdata =3D elf_getdata(str= sect, 0), *newstrdata =3D elf_newdata(strsect); - edata->d_align =3D 0x1000; + edata->d_align =3D 1; edata->d_size =3D data.size(); edata->d_off =3D 0; edata->d_type =3D ELF_T_BYTE; @@ -93,10 +124,12 @@ edata->d_buf =3D malloc(edata->d_size); memcpy(edata->d_buf, &data[0], edata->d_size); /* Add the name of the new section to the string table */ - newstrdata->d_off =3D strdata->d_off + strdata->d_size; + if (!lastStr) lastStr =3D strdata; + newstrdata->d_off =3D lastStr->d_off + lastStr->d_size; newstrdata->d_size =3D name.size() + 1; newstrdata->d_align =3D 1; newstrdata->d_buf =3D (void *)name.c_str(); + lastStr =3D newstrdata; /* Finish the section */ shdr->sh_name =3D newstrdata->d_off; shdr->sh_type =3D type;
Modified: trunk/tools/RosBE/RosBE-PPC/elfpe/objectfile.h URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/o= bjectfile.h?rev=3D32591&r1=3D32590&r2=3D32591&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/objectfile.h (original) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/objectfile.h Fri Mar 7 07:53:55 2008 @@ -78,11 +78,15 @@ =
uint8_t *getSectionData() const { if(!have_data) { - data =3D *elf_getdata(section, NULL); + data =3D *elf_getdata(section, NULL); have_data =3D true; } return (uint8_t *)data.d_buf; } + + void setDirty() const { + elf_flagscn(section, ELF_C_SET, ELF_F_DIRTY); + } =
private: const ElfObjectFile *obj; @@ -109,18 +113,30 @@ const Section *getNamedSection(const std::string &name) const; const Symbol &getSymbol(int n) const { return *symbols[n]; } const Symbol *getNamedSymbol(const std::string &symname) const; + void update() =
+ { =
+ elf_flagelf(elfHeader, ELF_C_SET, ELF_F_DIRTY); + elf_update(elfHeader, ELF_C_WRITE); =
+ finalize(); + init(); + } =
private: int fd; int shnum, phnum; int shstrndx; Elf *elfHeader; + Elf_Data *lastStr; + std::string filename; std::vector<Section*> sections; std::map<std::string, const Section *> sections_by_name; std::vector<Symbol*> symbols; std::map<std::string, const Symbol *> symbols_by_name; =
+ void init(); + void finalize(); void populateSymbolTable(); + void populateSections(); }; =
#endif//COMPDVR_ELFOBJECT_H
Added: trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.cpp URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/r= eloc.cpp?rev=3D32591&view=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.cpp (added) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.cpp Fri Mar 7 07:53:55 2008 @@ -1,0 +1,192 @@ +#include "objectfile.h" +#include "reloc.h" +#include "section.h" +#include "util.h" +#include <assert.h> + +void AddReloc +(std::vector<uint8_t> &reloc, =
+ uint32_t imageBase, + uint32_t &relocAddrOff, + uint32_t newReloc, int type) +{ + size_t oldsize =3D reloc.size(), oddsize =3D oldsize & sizeof(uint16_t= ); + uint8_t *relptr; + if (relocAddrOff =3D=3D (uint32_t)-1) + { + reloc.resize(sizeof(uint32_t) * 2 + sizeof(uint16_t)); + relocAddrOff =3D 0; + *GetRelocTarget(reloc, relocAddrOff) =3D newReloc & ~0xfff; + relptr =3D &reloc[2 * sizeof(uint32_t)]; + } + else if (type !=3D -1 && ((newReloc & ~0xfff) !=3D *GetRelocTarget(rel= oc, relocAddrOff))) + { + reloc.resize(reloc.size() + 2 * sizeof(uint32_t) + sizeof(uint16_t= ) + oddsize); + relptr =3D &reloc[oldsize + oddsize]; + uint8_t *oldptr =3D (uint8_t*)GetRelocTarget(reloc, relocAddrOff); + le32write_postinc(oldptr, *GetRelocTarget(reloc, relocAddrOff) - imageBas= e); + le32write_postinc(oldptr, relptr - &reloc[0] - relocAddrOff); + relocAddrOff =3D relptr - &reloc[0]; + *GetRelocTarget(reloc, relocAddrOff) =3D newReloc & ~0xfff; + relptr +=3D sizeof(uint32_t); + le32write_postinc(relptr, 0); + } + else + { + reloc.resize(reloc.size() + sizeof(uint16_t)); + relptr =3D &reloc[oldsize]; + } + + le16write(relptr, type << 12 | newReloc & 0xfff); +} + +#define ADDR24_MASK 0xfc000003 + +void SingleReloc +(const ElfObjectFile &eof, + uint8_t *relptr, int relocsize, =
+ const std::vector<section_mapping_t> &rvas, + const ElfObjectFile::Section &symbols, + const ElfObjectFile::Section &target, + std::vector<uint8_t> &relocSect, + uint32_t imageBase, + uint32_t &relocAddr) +{ + int j; + Elf32_Rela reloc =3D { 0 }; + Elf32_Sym symbol; + uint8_t *symptr; + uint32_t S,A,P; + =
+ /* Get the reloc */ + memcpy(&reloc, relptr, relocsize); +#if 0 + printf("RELOC: offset %08x info %08x addend %08x [%02x %06x]\n", =
+ reloc.r_offset, reloc.r_info, reloc.r_addend, + ELF32_R_TYPE(reloc.r_info), ELF32_R_SYM(reloc.r_info)); +#endif + =
+ /* Get the symbol */ + symptr =3D &symbols.getSectionData() + [ELF32_R_SYM(reloc.r_info) * sizeof(symbol)]; + memcpy(&symbol, symptr, sizeof(symbol)); + + /* Compute addends */ + S =3D symbol.st_value - =
+ eof.getSection(symbol.st_shndx).getStartRva() + =
+ FindRVA(rvas, symbol.st_shndx) + =
+ imageBase; + A =3D reloc.r_addend; + P =3D reloc.r_offset + FindRVA(rvas, target.getNumber()) - target.getS= tartRva(); + //printf("start of target elf section %08x\n", target.getStartRva()); + +#if 0 + printf("SYMBOL: value %08x size %08x info %02x other %02x shndx %08x t= otal %08x\n", + symbol.st_value, + symbol.st_size, + symbol.st_info, + symbol.st_other, + symbol.st_shndx, + S); +#endif + + uint8_t *Target =3D TargetPtr(rvas, target, P); + uint8_t *tword =3D TargetPtr(rvas, target, P & ~3); + uint8_t oldBytes[sizeof(uint32_t)]; + memcpy(oldBytes, tword, sizeof(oldBytes)); + =
+ P +=3D imageBase; + + switch (ELF32_R_TYPE(reloc.r_info)) + { + case R_PPC_NONE: + break; + case R_PPC_ADDR32: + //printf("ADDR32 S %08x A %08x P %08x\n", S, A, P); + be32write(Target, S + A); + AddReloc(relocSect, imageBase, relocAddr, P, 3); + break; + case R_PPC_REL32: + //printf("REL32 S %08x A %08x P %08x\n", S, A, P); + be32write(Target, S + A - P); + break; + case R_PPC_UADDR32: /* Special: Treat as RVA */ + //printf("UADDR32 S %08x A %08x P %08x\n", S, A, P); + be32write(Target, S + A - imageBase); + break; + case R_PPC_REL24: + //printf("REL24 S %08x A %08x P %08x\n", S, A, P); + //printf("New Offset: %08x to Addr %08x from %08x\n", S+A-P, S+A, = P); + be32write(Target, ((S+A-P) & ~ADDR24_MASK) | (be32read(Target) & A= DDR24_MASK)); + break; + case R_PPC_ADDR16_LO: + //printf("ADDR16_LO S %08x A %08x P %08x\n", S, A, P); + be16write(Target, S + A); + AddReloc(relocSect, imageBase, relocAddr, P, 2); + break; + case R_PPC_ADDR16_HA: + //printf("ADDR16_HA S %08x A %08x P %08x\n", S, A, P); + be16write(Target, (S + A + 0x8000) >> 16); + AddReloc(relocSect, imageBase, relocAddr, P, 4); + AddReloc(relocSect, imageBase, relocAddr, S + A, -1); + break; + default: + break; + } + + uint8_t newBytes[sizeof(uint32_t)]; + memcpy(newBytes, tword, sizeof(newBytes)); +#if 0 + printf("Reloc changed %08x [%02x %02x %02x %02x] --> [%02x %02x %02x %= 02x]\n", + P & ~3, + oldBytes[0], + oldBytes[1], + oldBytes[2], + oldBytes[3], + newBytes[0], + newBytes[1], + newBytes[2], + newBytes[3]); +#endif +} + +void SingleRelocSection +(const ElfObjectFile &obf, =
+ const ElfObjectFile::Section §ion, + const std::vector<section_mapping_t> &rvas, + std::vector<uint8_t> &relocData, + uint32_t imageBase, + uint32_t &relocAddr) +{ + Elf32_Rela reloc =3D { }; + uint8_t *Target; + int numreloc, relstart, relsize, j; + uint8_t *sectionData =3D section.getSectionData(); + =
+ relsize =3D section.getType() =3D=3D SHT_RELA ? 12 : 8; + numreloc =3D section.logicalSize() / relsize; + const ElfObjectFile::Section &targetSection =3D obf.getSection(section= .getInfo()); + + /* Don't relocate non-program section */ + if (!(targetSection.getFlags() & SHF_ALLOC)) + return; + + targetSection.setDirty(); + + /* Get the symbol section */ + const ElfObjectFile::Section &symbolSection =3D obf.getSection(section= .getLink()); + + for(j =3D 0; j < numreloc; j++) + { + SingleReloc + (obf, + sectionData + j * relsize, =
+ relsize, + rvas, + symbolSection, + targetSection, + relocData, + imageBase, + relocAddr); + } +}
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.cpp ---------------------------------------------------------------------------= --- svn:eol-style =3D native
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.cpp ---------------------------------------------------------------------------= --- svn:executable =3D *
Added: trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.h URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/r= eloc.h?rev=3D32591&view=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.h (added) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.h Fri Mar 7 07:53:55 2008 @@ -1,0 +1,22 @@ +#ifndef _ELFPE_RELOC_H +#define _ELFPE_RELOC_H + +#include <vector> +#include "section.h" +#include "objectfile.h" + +void SingleRelocSection +(const ElfObjectFile &obf, + const ElfObjectFile::Section §ion, + const std::vector<section_mapping_t> &rvas, + std::vector<uint8_t> &relocData, + uint32_t imageBase, + uint32_t &relocAddr); + +void AddReloc +(std::vector<uint8_t> &reloc, =
+ uint32_t imageBase, + uint32_t &relocAddrOff, + uint32_t newReloc, int type); + +#endif//_ELFPE_RELOC_H
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.h ---------------------------------------------------------------------------= --- svn:eol-style =3D native
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/reloc.h ---------------------------------------------------------------------------= --- svn:executable =3D *
Added: trunk/tools/RosBE/RosBE-PPC/elfpe/section.h URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/s= ection.h?rev=3D32591&view=3Dauto =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/section.h (added) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/section.h Fri Mar 7 07:53:55 2008 @@ -1,0 +1,16 @@ +#ifndef COMPDVR_SECTION_H +#define COMPDVR_SECTION_H + +typedef struct section_mapping_t { + const ElfObjectFile::Section *section; + uint32_t rva; + int index; + =
+ section_mapping_t + (const ElfObjectFile::Section *sect, uint32_t rva, int index) : + section(sect), rva(rva), index(index) { } + section_mapping_t(const section_mapping_t &other) : + section(other.section), rva(other.rva), index(other.index) { } +} section_mapping_t; + +#endif//COMPDVR_SECTION_H
Propchange: trunk/tools/RosBE/RosBE-PPC/elfpe/section.h ---------------------------------------------------------------------------= --- svn:eol-style =3D native
Modified: trunk/tools/RosBE/RosBE-PPC/elfpe/util.cpp URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/u= til.cpp?rev=3D32591&r1=3D32590&r2=3D32591&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/util.cpp (original) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/util.cpp Fri Mar 7 07:53:55 2008 @@ -1,4 +1,5 @@ #include "util.h" +#include <assert.h> =
uint32_t roundup(uint32_t value, int round) { @@ -34,7 +35,29 @@ le32write_postinc(dataptr, value.second); } =
-uint16_t be16read(uint8_t *dataptr) +void be16write_postinc(uint8_t *&dataptr, uint16_t value) +{ + *dataptr++ =3D value >> 8; + *dataptr++ =3D value; +} + +void be16write(uint8_t *dataptr, uint16_t value) +{ + be16write_postinc(dataptr, value); +} + +void be32write_postinc(uint8_t *&dataptr, uint32_t value) +{ + be16write_postinc(dataptr, value >> 16); + be16write_postinc(dataptr, value); +} + +void be32write(uint8_t *dataptr, uint32_t value) +{ + be32write_postinc(dataptr, value); +} + +uint16_t be16read(uint8_t *dataptr) =
{ return dataptr[0] << 8 | dataptr[1]; } @@ -48,7 +71,7 @@ =
uint32_t be32read(uint8_t *dataptr) { - return be16read(dataptr) << 16 | be16read(dataptr+2); + return (be16read(dataptr) << 16) | be16read(dataptr+2); } =
uint32_t be32read_postinc(uint8_t *&dataptr) @@ -57,3 +80,35 @@ dataptr +=3D 4; return res; } + +uint32_t FindRVA(const std::vector<section_mapping_t> &mapping, int secnum) +{ + int i; + for (i =3D 0; i < mapping.size(); i++) + if (mapping[i].section->getNumber() =3D=3D secnum) return mapping[i].rva; + return 0; +} + +uint8_t *TargetPtr +(const std::vector<section_mapping_t> &mapping, =
+ const ElfObjectFile::Section &target, uint32_t va) +{ + uint32_t srva =3D FindRVA(mapping, target.getNumber()); + uint32_t off =3D va - srva; +#if 0 + printf + ("Relocating against VA %08x in section (%08x-%08x) %s\n", =
+ va, =
+ srva, =
+ srva + target.logicalSize(), =
+ target.getName().c_str()); +#endif + assert(off < target.logicalSize()); + return target.getSectionData() + off; +} + +uint32_t *GetRelocTarget(const std::vector<uint8_t> &reloc, uint32_t off) +{ + return (uint32_t *)(&reloc[0] + off); +} +
Modified: trunk/tools/RosBE/RosBE-PPC/elfpe/util.h URL: http://svn.reactos.org/svn/reactos/trunk/tools/RosBE/RosBE-PPC/elfpe/u= til.h?rev=3D32591&r1=3D32590&r2=3D32591&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/tools/RosBE/RosBE-PPC/elfpe/util.h (original) +++ trunk/tools/RosBE/RosBE-PPC/elfpe/util.h Fri Mar 7 07:53:55 2008 @@ -1,8 +1,11 @@ #ifndef COMPDVR_UTIL_H #define COMPDVR_UTIL_H =
+#include <vector> #include <utility> #include <stdint.h> +#include "objectfile.h" +#include "section.h" =
void le16write(uint8_t *dataptr, uint16_t value); void le16write_postinc(uint8_t *&dataptr, uint16_t value); @@ -12,6 +15,10 @@ uint16_t le16read_postinc(uint8_t *&dataptr); uint32_t le32read(uint8_t *dataptr); uint32_t le32read_postinc(uint8_t *&dataptr); +void be16write(uint8_t *dataptr, uint16_t value); +void be16write_postinc(uint8_t *&dataptr, uint16_t value); +void be32write(uint8_t *dataptr, uint32_t value); +void be32write_postinc(uint8_t *&dataptr, uint32_t value); uint16_t be16read(uint8_t *dataptr); uint16_t be16read_postinc(uint8_t *&dataptr); uint32_t be32read(uint8_t *dataptr); @@ -21,4 +28,10 @@ void le32pwrite(uint8_t *dataptr, const u32pair_t &pair); uint32_t roundup(uint32_t value, int round); =
+uint32_t FindRVA(const std::vector<section_mapping_t> &mapping, int secnum= ); +uint8_t *TargetPtr +(const std::vector<section_mapping_t> &mapping, =
+ const ElfObjectFile::Section &target, uint32_t va); +uint32_t *GetRelocTarget(const std::vector<uint8_t> &reloc, uint32_t off); + #endif//COMPDVR_UTIL_H