| 1 |
#ifndef OBJFILE_H |
|---|
| 2 |
#define OBJFILE_H |
|---|
| 3 |
|
|---|
| 4 |
#include "root.h" |
|---|
| 5 |
|
|---|
| 6 |
typedef void *SymHandle; |
|---|
| 7 |
typedef unsigned SegOffset; |
|---|
| 8 |
|
|---|
| 9 |
enum ObjFormat |
|---|
| 10 |
{ |
|---|
| 11 |
NTCOFF, |
|---|
| 12 |
ELF |
|---|
| 13 |
}; |
|---|
| 14 |
|
|---|
| 15 |
struct ObjFile : File |
|---|
| 16 |
{ |
|---|
| 17 |
ObjFile(FileName *); |
|---|
| 18 |
~ObjFile(); |
|---|
| 19 |
|
|---|
| 20 |
ObjFile *init(ObjFormat); |
|---|
| 21 |
|
|---|
| 22 |
void comment(const char *); // insert comment into object file |
|---|
| 23 |
void modulename(const char *); // set module name |
|---|
| 24 |
void library(const char *); // add default library |
|---|
| 25 |
void startaddress(SegHandle seg, SegOffset offset); // set start address |
|---|
| 26 |
|
|---|
| 27 |
// Segments |
|---|
| 28 |
enum SegHandle |
|---|
| 29 |
{ code = 1, |
|---|
| 30 |
data, bss |
|---|
| 31 |
}; |
|---|
| 32 |
|
|---|
| 33 |
SymHandle defineSym(const char *name, SegHandle seg, SegOffset offset); |
|---|
| 34 |
SymHandle externSym(const char *name); |
|---|
| 35 |
|
|---|
| 36 |
SegOffset write(SegHandle seg, const void *data, unsigned nbytes); |
|---|
| 37 |
SegOffset writestring(SegHandle seg, char *string); |
|---|
| 38 |
SegOffset write8(SegHandle seg, unsigned b); |
|---|
| 39 |
SegOffset write16(SegHandle seg, unsigned w); |
|---|
| 40 |
SegOffset write32(SegHandle seg, unsigned long v); |
|---|
| 41 |
SegOffset write64(SegHandle seg, unsigned long long v); |
|---|
| 42 |
SegOffset fill0(SegHandle seg, unsigned nbytes); |
|---|
| 43 |
SegOffset align(SegHandle seg, unsigned size); |
|---|
| 44 |
SegOffset writefixup(SegHandle seg, SymHandle sym, unsigned value, int selfrelative); |
|---|
| 45 |
|
|---|
| 46 |
// Non-binding hint as to how big seg will grow |
|---|
| 47 |
void reserve(SegHandle seg, SegOffset size); |
|---|
| 48 |
|
|---|
| 49 |
// Set actual size |
|---|
| 50 |
void setSize(SegHandle seg, SegOffset size); |
|---|
| 51 |
|
|---|
| 52 |
// Get/set offset for subsequent writes |
|---|
| 53 |
void setOffset(SegHandle seg, SegOffset offset); |
|---|
| 54 |
SegOffset getOffset(SegHandle seg); |
|---|
| 55 |
|
|---|
| 56 |
SegHandle createSeg(const char *name); |
|---|
| 57 |
}; |
|---|
| 58 |
|
|---|
| 59 |
#endif |
|---|