OpenCores
URL https://opencores.org/ocsvn/thor/thor/trunk

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [software/] [AS64/] [source/] [Elf.cpp] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 robfinch
#include "stdafx.h"
2
 
3
void Elf64File_WriteHeader(Elf64File *f, FILE *fp)
4
{
5
     f->hdr.e_ident[0] = 127;
6
     f->hdr.e_ident[1] = 'E';
7
     f->hdr.e_ident[2] = 'L';
8
     f->hdr.e_ident[3] = 'F';
9
     f->hdr.e_ident[4] = ELFCLASS64;
10
     f->hdr.e_ident[5] = ELFDATA2LSB;
11
     f->hdr.e_ident[6] = 1;          // header version, always 1
12
     f->hdr.e_ident[7] = 255;        // OS/ABI identification, 255 = standalone
13
     f->hdr.e_ident[8] = 255;        // OS/ABI version
14
     f->hdr.e_ident[9] = 0;          // reserved byte
15
     f->hdr.e_ident[10] = 0;          // reserved byte
16
     f->hdr.e_ident[11] = 0;          // reserved byte
17
     f->hdr.e_ident[12] = 0;          // reserved byte
18
     f->hdr.e_ident[13] = 0;          // reserved byte
19
     f->hdr.e_ident[14] = 0;          // reserved byte
20
     f->hdr.e_ident[15] = 0;          // reserved byte
21
     f->hdr.e_type = 2;
22
     f->hdr.e_machine = 888;
23
     f->hdr.e_version = 1;
24
     f->hdr.e_entry = 0;
25
     f->hdr.e_phoff = 160;
26
     f->hdr.e_shoff = 0;
27
     f->hdr.e_flags = 0;
28
     f->hdr.e_ehsize = Elf64HdrSize;  // 64
29
     f->hdr.e_phentsize = 64;
30
     f->hdr.e_phnum = 4;
31
     f->hdr.e_shentsize = 0;
32
     f->hdr.e_shnum = 0;
33
     f->hdr.e_shstrndx = 0;
34
}
35
 
36
void Elf64File_WriteCodeSegmentHeader(FILE *fp)
37
{
38
     Elf64Phdr hdr;
39
 
40
     hdr.p_type = 1;          // loadable code
41
     hdr.p_flags = 1;         // execute only
42
     hdr.p_offset = 512;      // offset of segment in file
43
     hdr.p_vaddr = 4096;      // virtual address
44
     hdr.p_paddr = 0;         // physical address (not used)
45
     hdr.p_filesz = binndx;   // size of segment in file
46
     hdr.p_memsz == binndx;   // size of segment in memory
47
     hdr.p_align = 1;         // alignment of segment in memory
48
     Elf64Phdr_Write(&hdr, fp);
49
}
50
 
51
void Elf64File_WriteDataSegmentHeader(FILE *fp)
52
{
53
    Elf64Phdr hdr;
54
 
55
    hdr.p_type = 1;  // loadable code
56
    hdr.p_flags = 6; // read/write only
57
    hdr.p_offset = 512 + binndx;    // offset of segment in file
58
    hdr.p_vaddr = 4096;
59
    hdr.p_paddr = 0;
60
    hdr.p_filesz = sections[2].sect.index;
61
    hdr.p_memsz = sections[2].sect.index;
62
    hdr.p_align = 8;
63
    Elf64Phdr_Write(&hdr, fp);
64
}
65
 
66
void Elf64File_WriteBSSSegmentHeader(FILE *fp)
67
{
68
    Elf64Phdr hdr;
69
 
70
    hdr.p_type = 1;  // loadable code
71
    hdr.p_flags = 6; // read/write only
72
    hdr.p_offset = 512 + sections[0].sect.index + sections[1].sect.index + sections[2].sect.index;    // offset of segment in file
73
    hdr.p_vaddr = sections[3].sect.start;
74
    hdr.p_paddr = 0;
75
    hdr.p_filesz = 0;
76
    hdr.p_memsz = sections[3].sect.index;
77
    hdr.p_align = 8;
78
    Elf64Phdr_Write(&hdr, fp);
79
}
80
 
81
void Elf64File_WriteTLSSegmentHeader(FILE *fp)
82
{
83
    Elf64Phdr hdr;
84
 
85
    hdr.p_type = 1;  // loadable code
86
    hdr.p_flags = 6; // read/write only
87
    hdr.p_offset = 512 + sections[0].sect.index + sections[1].sect.index + sections[2].sect.index;    // offset of segment in file
88
    hdr.p_vaddr = 0;//tlsStart;
89
    hdr.p_paddr = 0;
90
    hdr.p_filesz = 0;
91
    hdr.p_memsz = sections[4].sect.index;
92
    hdr.p_align = 8;
93
    Elf64Phdr_Write(&hdr, fp);
94
}
95
 
96
void ElfSection_Write(Elf64Section *sect, FILE *fp)
97
{
98
     fwrite((void *)(&sect->bytes),1,sect->length,fp);
99
}
100
 
101
void Elf64File_Write(Elf64File *f, FILE *fp)
102
{
103
    int nn;
104
 
105
    Elf64File_WriteHeader(f, fp);
106
    fseek(fp, 512, SEEK_SET);
107
    for (nn = 0; nn < NumSections; nn++) {
108
        fseek(fp, sections[nn].sect.hdr.sh_offset, SEEK_SET);
109
        ElfSection_Write(&sections[nn].sect, fp);
110
    }
111
    fseek(fp, f->hdr.e_shoff, SEEK_SET);
112
    Elf64File_WriteSectionHeaderTable(fp);
113
}
114
 
115
void Elf64File_WriteProgramHeaderTable(FILE *fp)
116
{
117
     fseek(fp, 160, SEEK_SET);
118
     Elf64File_WriteCodeSegmentHeader(fp);
119
     Elf64File_WriteDataSegmentHeader(fp);
120
     Elf64File_WriteBSSSegmentHeader(fp);
121
     Elf64File_WriteTLSSegmentHeader(fp);
122
}
123
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.