annotate dynload/dynload_syms_elf.c @ 315:3840e0188520

- allowing lookup of running executable's path by passing NULL to dynload's dlGetLibraryPath()
author Tassilo Philipp
date Wed, 06 Nov 2019 14:13:49 +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