annotate dynload/dynload_syms_elf.c @ 357:d982a00c2177

- PPC64 asm syntax fix, specifying explicitly comparison mode for cmpi (newer toolchains complain, older ones took optional field of instruction which happened to be same value)
author Tassilo Philipp
date Tue, 25 Feb 2020 18:16:13 +0100
parents f5577f6bf97a
children 2c2b51819aad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: dynload
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dynload/dynload_syms_elf.c
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
281
f5577f6bf97a - file header cleanups for release
Tassilo Philipp
parents: 231
diff changeset
9 Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 Olivier Chafik <olivier.chafik@gmail.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 #include "../autovar/autovar_OS.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 dynamic symbol resolver for elf
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 #include "dynload.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 #if defined(OS_OpenBSD)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 # include <stdint.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 # include <elf_abi.h>
207
bff2b940ea39 - netbsd include fix (stddef.h needed before elf.h)
Tassilo Philipp
parents: 171
diff changeset
41 #elif defined(OS_NetBSD)
bff2b940ea39 - netbsd include fix (stddef.h needed before elf.h)
Tassilo Philipp
parents: 171
diff changeset
42 # include <stddef.h>
bff2b940ea39 - netbsd include fix (stddef.h needed before elf.h)
Tassilo Philipp
parents: 171
diff changeset
43 # include <elf.h>
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 #elif defined(OS_SunOS)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 # include <libelf.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 #elif defined(OS_BeOS)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 # include <elf32.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 # include <elf.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 #if defined(__GLIBC__)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 # define _GNU_SOURCE
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 # define __USE_GNU
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 #include "dynload_alloc.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 #include <assert.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 #include <fcntl.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 #include <dlfcn.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 #include <stdio.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 #include <string.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 #include <sys/stat.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 #include <sys/types.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 #include <sys/mman.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 #include <unistd.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 /* run-time configuration 64/32 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 #if defined(OS_OpenBSD)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 # include "../autovar/autovar_ABI.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 # ifdef ABI_ELF64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 typedef Elf64_Ehdr Elf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 typedef Elf64_Phdr Elf_Phdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 typedef Elf64_Shdr Elf_Shdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 typedef Elf64_Sym Elf_Sym;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 # ifndef OS_SunOS
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 typedef Elf64_Dyn Elf_Dyn;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 typedef Elf64_Sxword Elf_tag;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 typedef Elf64_Addr Elf_Addr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 # else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 # if defined(OS_BeOS)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 typedef struct Elf32_Ehdr Elf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 typedef struct Elf32_Phdr Elf_Phdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 typedef struct Elf32_Shdr Elf_Shdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 typedef struct Elf32_Sym Elf_Sym;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 typedef struct Elf32_Dyn Elf_Dyn;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 typedef Elf32_Sword Elf_tag;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 typedef Elf32_Addr Elf_Addr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 # else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 typedef Elf32_Ehdr Elf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 typedef Elf32_Phdr Elf_Phdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 typedef Elf32_Shdr Elf_Shdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 typedef Elf32_Sym Elf_Sym;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 # ifndef OS_SunOS
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 typedef Elf32_Dyn Elf_Dyn;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 typedef Elf32_Sword Elf_tag;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 typedef Elf32_Addr Elf_Addr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 struct DLSyms_
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 const char* pStrTab;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 Elf_Sym* pSymTab;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 size_t strTabSize;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 size_t nSymbols;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 Elf_Ehdr* pElf_Ehdr; /* pointer to elf header */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 int file; /* fd of lib */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 size_t fileSize; /* filesize of open lib */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 DLSyms* dlSymsInit(const char* libPath)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 unsigned char* pMem;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 int i;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 struct stat st;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 Elf_Shdr* pS;
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
130 DLSyms* pSyms;
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
131
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
132 if(stat(libPath, &st) == -1)
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
133 return NULL;
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
134
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
135 i = open(libPath, O_RDONLY);
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
136 if(i == -1)
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
137 return NULL;
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
138
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
139 pSyms = (DLSyms*)dlAllocMem(sizeof(DLSyms));
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 memset(pSyms, 0, sizeof(DLSyms));
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
141 pSyms->file = i;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 pSyms->fileSize = st.st_size;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 pSyms->pElf_Ehdr = (Elf_Ehdr*) mmap((void*) NULL, pSyms->fileSize, PROT_READ, MAP_SHARED, pSyms->file, 0);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 #ifdef ABI_ELF32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS32);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS64);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 assert(pSyms->pElf_Ehdr->e_phoff > 0);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 assert(pSyms->pElf_Ehdr->e_shoff > 0);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 pMem = (unsigned char*)pSyms->pElf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 /* traverse section headers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 pS = (Elf_Shdr*) ( pMem + pSyms->pElf_Ehdr->e_shoff );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 /* skip section 0 which is always zero due to the Elf standard. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 for (i = 1; i < pSyms->pElf_Ehdr->e_shnum; i++)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 Elf_Shdr* pSection = &pS[i];
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
163 void* pSectionContent = ((char*)pMem) + pSection->sh_offset;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 switch (pSection->sh_type)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 case SHT_DYNSYM:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 if (!pSyms->pSymTab) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 pSyms->pSymTab = (Elf_Sym*)pSectionContent;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 pSyms->nSymbols = pSection->sh_size / pSection->sh_entsize;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 case SHT_STRTAB:
171
011b5e3a8548 - compatibility for older platforms - use ANSI comments
cslag
parents: 0
diff changeset
173 /* Do not trust pSyms->pElf_Ehdr->e_shstrndx! */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 if (!pSyms->pStrTab) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 pSyms->pStrTab = (const char*)pSectionContent;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 pSyms->strTabSize = pSection->sh_size;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 if (pSyms->pSymTab && pSyms->pStrTab)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 return pSyms;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 void dlSymsCleanup(DLSyms* pSyms)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 if(pSyms) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 munmap((void*) pSyms->pElf_Ehdr, pSyms->fileSize);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 close(pSyms->file);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 dlFreeMem(pSyms);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 int dlSymsCount(DLSyms* pSyms)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 {
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
199 return pSyms ? pSyms->nSymbols : 0;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 const char* dlSymsName(DLSyms* pSyms, int index)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 int str_index;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 if(!pSyms || !pSyms->pSymTab || index < 0 || index >= pSyms->nSymbols)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 return NULL;
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
208
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 str_index = pSyms->pSymTab[index].st_name;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 if (str_index < 0 || str_index >= pSyms->strTabSize)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 return NULL;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 return &pSyms->pStrTab[str_index];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
216 const char* dlSymsNameFromValue(DLSyms* pSyms, void* value)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
217 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218 Dl_info info;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219 return (dladdr(value, &info) && (value == info.dli_saddr))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220 ? info.dli_sname
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221 : NULL;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223