]> asedeno.scripts.mit.edu Git - peal.git/blob - postlink/got.h
Greg Parker's Palm Elf Arm Loader (PEAL)
[peal.git] / postlink / got.h
1 /**********
2  * Copyright (c) 2004 Greg Parker.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY GREG PARKER ``AS IS'' AND ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  **********/
24
25 #ifndef GOT_H
26 #define GOT_H
27
28 #include <stdint.h>
29 #include <vector>
30
31 using namespace std;
32
33 #include "swap.h"
34 #include "section.h"
35 #include "relocation.h"
36 #include "symbol.h"
37 #include "complain.h"
38
39 class GOT : public Section {
40     vector<uint32_t> mEntries;
41     vector<const Symbol *> mSymbols; 
42
43 public:
44     GOT(Image& newImage)
45         : Section(newImage)
46     { }
47     
48     void read(Elf32_Shdr *shdr)
49     {
50         Section::read(shdr);
51
52         uint32_t *entryArray = (uint32_t *)mContents;
53         mEntries.resize(mSize / 4);
54         mSymbols.resize(mSize / 4);
55         for (unsigned int i = 0; i < mSize / 4; i++) {
56             mEntries[i] = swap32(entryArray[i]);
57             mSymbols[i] = NULL;
58         }
59     }
60
61     const vector<uint32_t>& entries(void) const { return mEntries; }
62     vector<const Symbol *>& symbols(void) { return mSymbols; }
63
64     void buildRelocations(void) 
65     {
66         // GOT entries may refer to local symbols, which will be stripped. 
67         // Instead, use section symbol + offset in section.
68
69         mContents = (uint8_t *)calloc(mEntries.size(), 4);
70         mSize = mEntries.size() * 4;
71
72         for (unsigned int g = 0; g < mSymbols.size(); g++) {
73             if (mSymbols[g]) {
74                 if (!mSymbols[g]->section()) {
75                     unimplemented("GOT entry is an absolute or other section-less symbol");
76                 }
77                 Symbol *sectionSymbol = mSymbols[g]->section()->baseSymbol();
78                 mRelocations.push_back
79                     (Relocation(R_ARM_ABS32, g*4, sectionSymbol, 
80                                 mSymbols[g]->offset(thumb)));
81             }
82         }
83     }
84
85     void emit(Elf32_Shdr *shdr, uint8_t *&buf, uint32_t& bufLen)
86     {
87         // Emitted GOT is all zero. Use NOBITS rather than PROGBITS.
88         mType = SHT_NOBITS;
89         Section::emit(shdr, buf, bufLen);
90     }
91 };
92
93 #endif