tests: log_call is not returning any value
[gem5.git] / src / base / loader / elf_object.hh
1 /*
2 * Copyright (c) 2013, 2019 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Copyright (c) 2003-2005 The Regents of The University of Michigan
15 * All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions are
19 * met: redistributions of source code must retain the above copyright
20 * notice, this list of conditions and the following disclaimer;
21 * redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the distribution;
24 * neither the name of the copyright holders nor the names of its
25 * contributors may be used to endorse or promote products derived from
26 * this software without specific prior written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 */
40
41 #ifndef __BASE_LOADER_ELF_OBJECT_HH__
42 #define __BASE_LOADER_ELF_OBJECT_HH__
43
44 #include <set>
45 #include <vector>
46
47 #include "base/loader/object_file.hh"
48 #include "gelf.h"
49
50 namespace Loader
51 {
52
53 class ElfObjectFormat : public ObjectFileFormat
54 {
55 public:
56 ObjectFile *load(ImageFileDataPtr data) override;
57 };
58
59 class ElfObject : public ObjectFile
60 {
61 protected:
62 Elf *elf;
63 GElf_Ehdr ehdr;
64
65 void determineArch();
66 void determineOpSys();
67 void handleLoadableSegment(GElf_Phdr phdr, int seg_num);
68
69 // These values are provided to a linux process by the kernel, so we
70 // need to keep them around.
71 Addr _programHeaderTable = 0;
72 uint16_t _programHeaderSize = 0;
73 uint16_t _programHeaderCount = 0;
74 std::set<std::string> sectionNames;
75
76 ElfObject *interpreter = nullptr;
77
78 // An interpreter load bias is the location in the process address space
79 // where the interpreter is chosen to reside. Typically, this is carved
80 // out of the top of the mmap reserve section.
81 Addr ldBias = 0;
82
83 // The interpreter is typically a relocatable shared library and will
84 // have a default value of zero which means that it does not care where
85 // it is placed. However, the loader can be compiled and linked so that
86 // it does care and needs a specific entry point.
87 bool relocate = true;
88
89 // The ldMin and ldMax fields are required to know how large of an
90 // area is required to map the interpreter.
91 Addr ldMin = MaxAddr;
92 Addr ldMax = MaxAddr;
93
94 /// Helper functions for loadGlobalSymbols() and loadLocalSymbols().
95 bool loadSomeSymbols(SymbolTable *symtab, int binding, Addr mask,
96 Addr base, Addr offset);
97
98 void getSections();
99 bool sectionExists(std::string sec);
100
101 MemoryImage image;
102
103 public:
104 ElfObject(ImageFileDataPtr ifd);
105 ~ElfObject();
106
107 MemoryImage buildImage() const override { return image; }
108
109 ObjectFile *getInterpreter() const override { return interpreter; }
110 std::string getInterpPath(const GElf_Phdr &phdr) const;
111
112 Addr bias() const override { return ldBias; }
113 bool relocatable() const override { return relocate; }
114 Addr mapSize() const override { return ldMax - ldMin; }
115 void updateBias(Addr bias_addr) override;
116
117 bool hasTLS() override { return sectionExists(".tbss"); }
118
119 Addr programHeaderTable() {return _programHeaderTable;}
120 uint16_t programHeaderSize() {return _programHeaderSize;}
121 uint16_t programHeaderCount() {return _programHeaderCount;}
122 };
123
124 /**
125 * This is the interface for setting up a base path for the
126 * elf interpreter. This is needed when loading a
127 * cross-compiled (guest ISA != host ISA) dynamically
128 * linked application.
129 * @param dirname base path for the interpreter
130 */
131 void setInterpDir(const std::string &dirname);
132
133 } // namespace Loader
134
135 #endif // __BASE_LOADER_ELF_OBJECT_HH__