diff options
Diffstat (limited to 'core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/Coff.java')
-rw-r--r-- | core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/Coff.java | 581 |
1 files changed, 0 insertions, 581 deletions
diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/Coff.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/Coff.java deleted file mode 100644 index 21b47cdb6ff..00000000000 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/coff/Coff.java +++ /dev/null @@ -1,581 +0,0 @@ -/* - * (c) Copyright QNX Software Systems Ltd. 2002. - * All Rights Reserved. - */ -package org.eclipse.cdt.utils.coff; - -import java.io.IOException; -import java.io.RandomAccessFile; -import java.text.DateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -public class Coff { - - public static final String NL = System.getProperty("line.separator", "\n"); - FileHeader filehdr; - OptionalHeader opthdr; - RandomAccessFile rfile; - long startingOffset; - byte[] string_table; - SectionHeader[] scnhdrs; - Symbol[] symbols; - - public static class FileHeader { - public final static int FILHSZ = 20; - - public final static int F_RELFLG = 0x0001; // relocation info stripped from file - public final static int F_EXEC = 0x0002; // file is executable - // (no unresolved external references) - public final static int F_LNNO = 0x0004; // line numbers stripped from file - public final static int F_LSYMS = 0x0008; // local symbols stripped from file - public final static int F_AR16WR = 0x0080; // file is 16-bit little-endian - public final static int F_AR32WR = 0x0100; // file is 32-bit little-endian - public final static int F_AR32W = 0x0200; // file is 32-bit big-endian - public final static int F_DYNLOAD = 0x1000;// rs/6000 aix: dynamically - // loadable w/imports & exports - public final static int F_SHROBJ = 0x2000; // rs/6000 aix: file is a shared object - public final static int F_DLL = 0x2000; // PE format DLL. - - public int f_magic; /* 00-01 2 bytes: magic number */ - public int f_nscns; /* 02-03 2 bytes: number of sections: 2 bytes */ - public int f_timdat; /* 04-07 4 bytes: time & date stamp */ - public int f_symptr; /* 08-11 4 bytes: file pointer to symtab */ - public int f_nsyms; /* 12-15 4 bytes: number of symtab entries */ - public int f_opthdr; /* 16-17 2 bytes: sizeof(optional hdr) */ - public int f_flags; /* 18-19 2 bytes: flags */ - - public FileHeader (RandomAccessFile file) throws IOException { - this(file, file.getFilePointer()); - } - - public FileHeader (RandomAccessFile file, long offset) throws IOException { - file.seek(offset); - byte[] hdr = new byte[FILHSZ]; - file.readFully(hdr); - ReadMemoryAccess memory = new ReadMemoryAccess(hdr, true); - f_magic = memory.getUnsignedShort(); - f_nscns = memory.getUnsignedShort(); - f_timdat = memory.getInt(); - f_symptr = memory.getInt(); - f_nsyms = memory.getInt(); - f_opthdr = memory.getUnsignedShort(); - f_flags = memory.getUnsignedShort(); - } - - public boolean isStrip() { - return (f_flags & F_RELFLG) == F_RELFLG; - } - - public boolean isExec() { - return (f_flags & F_EXEC) == F_EXEC; - } - - public boolean isDebug() { - return !((f_flags & F_LNNO) == F_LNNO); - } - - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("FILE HEADER VALUES").append(NL); - - buffer.append("f_magic = ").append(f_magic).append(NL); - buffer.append("f_nscns = ").append(f_nscns).append(NL); - - buffer.append("f_timdat = "); - buffer.append(DateFormat.getDateInstance().format(new Date(f_timdat))); - buffer.append(NL); - - buffer.append("f_symptr = ").append(f_symptr).append(NL); - buffer.append("f_nsyms = ").append(f_nsyms).append(NL); - buffer.append("f_opthdr = ").append(f_opthdr).append(NL); - buffer.append("f_flags = ").append(f_flags).append(NL); - return buffer.toString(); - } - } - - public static class OptionalHeader { - public final static int AOUTHDRSZ = 28; - - public short magic; /* 2 bytes: type of file */ - public short vstamp; /* 2 bytes: version stamp */ - public int tsize; /* 4 bytes: text size in bytes, padded to FW bdry*/ - public int dsize; /* 4 bytes: initialized data " " */ - public int bsize; /* 4 bytes: uninitialized data " " */ - public int entry; /* 4 bytes: entry pt. */ - public int text_start; /* 4 bytes: base of text used for this file */ - public int data_start; /* 4 bytes: base of data used for this file */ - - public OptionalHeader(RandomAccessFile file) throws IOException { - this(file, file.getFilePointer() + FileHeader.FILHSZ); - } - - public OptionalHeader(RandomAccessFile file, long offset) throws IOException { - file.seek(offset); - byte[] hdr = new byte[AOUTHDRSZ]; - file.readFully(hdr); - ReadMemoryAccess memory = new ReadMemoryAccess(hdr, true); - magic = memory.getShort(); - vstamp = memory.getShort(); - tsize = memory.getInt(); - dsize = memory.getInt(); - bsize = memory.getInt(); - entry = memory.getInt(); - text_start = memory.getInt(); - data_start = memory.getInt(); - } - - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("OPTIONAL HEADER VALUES").append(NL); - buffer.append("magic = ").append(magic).append(NL); - buffer.append("vstamp = ").append(vstamp).append(NL); - buffer.append("tsize = ").append(tsize).append(NL); - buffer.append("dsize = ").append(dsize).append(NL); - buffer.append("bsize = ").append(bsize).append(NL); - buffer.append("entry = ").append(entry).append(NL); - buffer.append("text_start = ").append(text_start).append(NL); - buffer.append("data_start = ").append(data_start).append(NL); - return buffer.toString(); - } - } - - public static class SectionHeader { - - public final static int SCNHSZ = 40; - - /* names of "special" sections */ - public final static String _TEXT = ".text"; - public final static String _DATA = ".data"; - public final static String _BSS = ".bss"; - public final static String _COMMENT = ".comment"; - public final static String _LIB = ".lib"; - - /* s_flags "type". */ - public final static int STYP_REG = 0x0000; /* "regular": allocated, relocated, - loaded */ - public final static int STYP_DSECT = 0x0001; /* "dummy": relocated only */ - public final static int STYP_NOLOAD = 0x0002; /* "noload": allocated, relocated, - not loaded */ - public final static int STYP_GROUP = 0x0004; /* "grouped": formed of input - sections */ - public final static int STYP_PAD = 0x0008; /* "padding": not allocated, not - relocated, loaded */ - public final static int STYP_COPY = 0x0010; /* "copy": for decision function - used by field update; - not allocated, not relocated, - loaded; reloc & lineno entries - processed normally */ - public final static int STYP_TEXT = 0x0020; /* section contains text only. */ - public final static int S_SHRSEG = 0x0020; /* In 3b Update files (output of - ogen), sections which appear in - SHARED segments of the Pfile - will have the S_SHRSEG flag set - by ogen, to inform dufr that - updating 1 copy of the proc. will - update all process invocations. */ - public final static int STYP_DATA = 0x0040; /* section contains data only */ - public final static int STYP_BSS = 0x0080; /* section contains bss only */ - public final static int S_NEWFCN = 0x0100; /* In a minimal file or an update - file, a new function (as - compared with a replaced - function) */ - public final static int STYP_INFO = 0x0200; /* comment: not allocated not - relocated, not loaded */ - public final static int STYP_OVER = 0x0400; /* overlay: relocated not allocated - or loaded */ - public final static int STYP_LIB = 0x0800; /* for .lib: same as INFO */ - public final static int STYP_MERGE = 0x2000; /* merge section -- combines with - text, data or bss sections only */ - public final static int STYP_REVERSE_PAD = 0x4000; /* section will be padded - with no-op instructions - wherever padding is necessary - and there is a word of - contiguous bytes beginning on a - word boundary. */ - - public final static int STYP_LIT = 0x8020; /* Literal data (like STYP_TEXT) */ - - - public byte[] s_name= new byte[8]; // 8 bytes: section name - public int s_paddr; // 4 bytes: physical address, aliased s_nlib - public int s_vaddr; // 4 bytes: virtual address - public int s_size; // 4 bytes: section size - public int s_scnptr; // 4 bytes: file ptr to raw data for section - public int s_relptr; // 4 bytes: file ptr to relocation - public int s_lnnoptr; // 4 bytes: file ptr to line numbers - public int s_nreloc; // 2 bytes: number of relocation entries - public int s_nlnno; // 2 bytes: number of line number entries - public int s_flags; // 4 bytes: flags - - RandomAccessFile sfile; - - public SectionHeader(RandomAccessFile file, long offset) throws IOException { - sfile = file; - file.seek(offset); - byte[] hdr = new byte[SCNHSZ]; - file.readFully(hdr); - ReadMemoryAccess memory = new ReadMemoryAccess(hdr, true); - memory.getBytes(s_name); - s_paddr = memory.getInt(); - s_vaddr = memory.getInt(); - s_size = memory.getInt(); - s_scnptr = memory.getInt(); - s_relptr = memory.getInt(); - s_lnnoptr = memory.getInt(); - s_nreloc = memory.getUnsignedShort(); - s_nlnno = memory.getUnsignedShort(); - s_flags = memory.getInt(); - } - - public byte[] getRawData() throws IOException { - byte[] data = new byte[s_size]; - sfile.seek(s_scnptr); - sfile.readFully(data); - return data; - } - - public Reloc[] getRelocs() throws IOException { - Reloc[] relocs = new Reloc[s_nreloc]; - sfile.seek(s_relptr); - for (int i = 0; i < s_nreloc; i++) { - relocs[i] = new Reloc(sfile); - } - return relocs; - } - - public Lineno[] getLinenos() throws IOException { - Lineno[] lines = new Lineno[s_nlnno]; - sfile.seek(s_lnnoptr); - for (int i = 0; i < s_nlnno; i++) { - lines[i] = new Lineno(sfile); - } - return lines; - } - - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("SECTION HEADER VALUES").append(NL); - buffer.append(new String(s_name)).append(NL); - buffer.append("s_paddr = ").append(s_paddr).append(NL); - buffer.append("s_vaddr = ").append(s_vaddr).append(NL); - buffer.append("s_size = ").append(s_size).append(NL); - buffer.append("s_scnptr = ").append(s_scnptr).append(NL); - buffer.append("s_relptr = ").append(s_relptr).append(NL); - buffer.append("s_lnnoptr = ").append(s_lnnoptr).append(NL); - buffer.append("s_nreloc = ").append(s_nreloc).append(NL); - buffer.append("s_nlnno = ").append(s_nlnno).append(NL); - buffer.append("s_flags = ").append(s_flags).append(NL); -/* - try { - Reloc[] rcs = getRelocs(); - for (int i = 0; i < rcs.length; i++) { - buffer.append(rcs[i]); - } - } catch (IOException e) { - } - try { - Lineno[] nos = getLinenos(); - for (int i = 0; i < nos.length; i++) { - buffer.append(nos[i]); - } - } catch (IOException e) { - } -*/ - return buffer.toString(); - } - } - - public static class Reloc { - public static final int RELSZ = 16; - public int r_vaddr; /* 4 byte: Pointer to an area in raw data that represents a - referenced address. */ - public int r_symndx; /* 4 byte: Index into symbol table. */ - public int r_type; /* 2 byte(unsigned short): Type of address reference. */ - - public Reloc(RandomAccessFile file) throws IOException { - this(file, file.getFilePointer()); - } - - public Reloc(RandomAccessFile file, long offset) throws IOException { - file.seek(offset); - byte[] bytes = new byte[RELSZ]; - file.readFully(bytes); - ReadMemoryAccess memory = new ReadMemoryAccess(bytes, true); - r_vaddr = memory.getInt(); - r_symndx = memory.getInt(); - r_type = memory.getUnsignedShort(); - } - - public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("RELOC VALUES").append(NL); - buffer.append("r_vaddr = ").append(r_vaddr); - buffer.append(" r_symndx = ").append(r_symndx).append(NL); - return buffer.toString(); - } - } - - public static class Lineno { - public final static int LINESZ = 6; - public int l_addr; /* long. Index into symbol table if l_linn0 == 0. - Break-pointable address if l_lnno > 0. */ - public int l_lnno; /* unsigned short. Line number */ - - public Lineno(RandomAccessFile file) throws IOException { - this(file, file.getFilePointer()); - } - - public Lineno(RandomAccessFile file, long offset) throws IOException { - file.seek(offset); - byte[] bytes = new byte[LINESZ]; - file.readFully(bytes); - ReadMemoryAccess memory = new ReadMemoryAccess(bytes, true); - l_addr = memory.getInt(); - l_lnno = memory.getUnsignedShort(); - } - - public String toString() { - StringBuffer buffer = new StringBuffer(); - if (l_lnno == 0) { - buffer.append("Function address = ").append(l_addr).append(NL); - } else { - buffer.append("line# ").append(l_lnno); - buffer.append(" at address = ").append(l_addr).append(NL); - } - return buffer.toString(); - } - } - - public static class Symbol { - public final static int SYMSZ = 18; - public final static int SYMNMLEN = 8; - - /* Derived types, in n_type. */ - public final static int DT_NON = 0; /* no derived type */ - public final static int DT_PTR = 1; /* pointer */ - public final static int DT_FCN = 2; /* function */ - public final static int DT_ARY = 3; /* array */ - - public final static int N_TMASK = 0x30; - public final static int N_BTSHFT = 4; - public final static int N_TSHIFT = 2; - - - public byte[] _n_name = new byte[SYMNMLEN]; /* Symbol name, or pointer into - string table if symbol name - is greater than SYMNMLEN. */ - public int n_value; /* long. Symbol;s value: dependent on section number, - storage class and type. */ - public short n_scnum; /* short, Section number. */ - public int n_type; /* Unsigned short. Symbolic type. */ - public byte n_sclass; /* char, Storage class. */ - public byte n_numaux; /* char. Nuymber of auxiliary enties. */ - - public Symbol(RandomAccessFile file) throws IOException { - this(file, file.getFilePointer()); - } - - public Symbol(RandomAccessFile file, long offset) throws IOException { - file.seek(offset); - byte[] bytes = new byte[SYMSZ]; - file.readFully(bytes); - ReadMemoryAccess memory = new ReadMemoryAccess(bytes, true); - memory.getBytes(_n_name); - n_value = memory.getInt(); - n_scnum = memory.getShort(); - n_type = memory.getUnsignedShort(); - n_sclass = memory.getByte(); - n_numaux = memory.getByte(); - } - - public boolean isLongName() { - return (_n_name[0] == 0); - } - - public String getName() { - for (int i = 0; i < _n_name.length; i++) { - if (_n_name[i] == 0) { - return new String(_n_name, 0, i); - } - } - return ""; - } - - public String getName(byte[] table) { - if (table.length > 0 && isLongName()) { - ReadMemoryAccess memory = new ReadMemoryAccess(_n_name, true); - memory.getInt(); - int offset = memory.getInt(); - if (offset > 0) { - for (int i = offset; i < table.length; i++) { - if (table[i] == 0) { - return new String(table, offset, i - offset); - } - } - } - } - return getName(); - } - - public boolean isPointer() { - return (n_type & N_TMASK) == (DT_PTR << N_BTSHFT); - } - - public boolean isFunction() { - return (n_type & N_TMASK) == (DT_FCN << N_BTSHFT); - } - - public boolean isArray() { - return (n_type & N_TMASK) == (DT_ARY << N_BTSHFT); - } - - public String toString() { - return getName(); - } - - } - - public FileHeader getFileHeader() throws IOException { - return filehdr; - } - - public OptionalHeader getOptionalHeader() throws IOException { - return opthdr; - } - - public SectionHeader[] getSectionHeaders() throws IOException { - if (scnhdrs == null) { - scnhdrs = new SectionHeader[getFileHeader().f_nscns]; - long sec = FileHeader.FILHSZ + getFileHeader().f_opthdr; - for (int i = 0; i < scnhdrs.length; i++, sec += SectionHeader.SCNHSZ) { - scnhdrs[i] = new SectionHeader(rfile, sec); - } - } - return scnhdrs; - } - - public Symbol[] getSymbols() throws IOException { - if (symbols == null) { - long offset = getFileHeader().f_symptr; - rfile.seek(offset); - symbols = new Symbol[getFileHeader().f_nsyms]; - for (int i = 0; i < symbols.length; i++) { - symbols[i] = new Symbol(rfile); - } - } - return symbols; - } - - public byte[] getStringTable() throws IOException { - if (string_table == null) { - long symbolsize = Symbol.SYMSZ * getFileHeader().f_nsyms; - long offset = getFileHeader().f_symptr + symbolsize; - rfile.seek(offset); - byte[] bytes = new byte[4]; - rfile.readFully(bytes); - int str_len = ReadMemoryAccess.getIntLE(bytes); - if (str_len > 4) { - str_len -= 4; - string_table = new byte[str_len]; - rfile.seek(offset + 4); - rfile.readFully(string_table); - } else { - string_table = new byte[0]; - } - } - return string_table; - } - - public String toString() { - StringBuffer buffer = new StringBuffer(); - try { - FileHeader header = null; - header = getFileHeader(); - if (header != null) { - buffer.append(header); - } - } catch (IOException e) { - e.printStackTrace(); - } - try { - OptionalHeader opt = null; - opt = getOptionalHeader(); - if (opt != null) { - buffer.append(opt); - } - } catch (IOException e) { - e.printStackTrace(); - } - try { - SectionHeader[] sections = getSectionHeaders(); - for (int i = 0; i < sections.length; i++) { - buffer.append(sections[i]); - } - } catch (IOException e) { - } - - try { - Symbol[] table = getSymbols(); - for (int i = 0; i < table.length; i++) { - buffer.append(table[i].getName(getStringTable())).append(NL); - } - } catch (IOException e) { - } - -// try { -// String[] strings = getStringTable(getStringTable()); -// for (int i = 0; i < strings.length; i++) { -// buffer.append(strings[i]); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } - return buffer.toString(); - } - - public static String[] getStringTable(byte[] bytes) { - List aList = new ArrayList(); - int offset = 0; - for (int i = 0; i < bytes.length; i++) { - if (bytes[i] == 0) { - aList.add(new String(bytes, offset, i - offset)); - offset = i + 1; - } - } - return (String[])aList.toArray(new String[0]); - } - - public Coff(String filename) throws IOException { - this(new RandomAccessFile(filename, "r"), 0); - } - - public Coff(RandomAccessFile file, long offset) throws IOException { - commonSetup(file, offset); - } - - void commonSetup(RandomAccessFile file, long offset) throws IOException { - startingOffset = offset; - rfile = file; - try { - filehdr = new FileHeader(rfile, offset); - if (filehdr.f_opthdr > 0) { - opthdr = new OptionalHeader(rfile, startingOffset + 20); - } - } finally { - if (filehdr == null) { - rfile.close(); - } - } - } - - public static void main(String[] args) { - try { - Coff coff = new Coff(args[0]); - System.out.println(coff); - } catch (IOException e) { - e.printStackTrace(); - } - } -} |