annotate dynload/dynload_syms_elf.c @ 457:90b1d927912a

- suite_aggrs: make sure random memory used doesn't ever result in NaN fp values (for every possible address), as this messes with result comparison
author Tassilo Philipp
date Fri, 28 Jan 2022 14:11:21 +0100
parents c7f879fef352
children 6a8aac9b2bcf
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 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 # include <elf.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 #if defined(__GLIBC__)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 # define _GNU_SOURCE
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 # define __USE_GNU
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 #include "dynload_alloc.h"
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 <assert.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 #include <fcntl.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 #include <dlfcn.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 #include <stdio.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 #include <string.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 #include <sys/stat.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 #include <sys/types.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 #include <sys/mman.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 #include <unistd.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 /* run-time configuration 64/32 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 #if defined(OS_OpenBSD)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 # include "../autovar/autovar_ABI.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 # ifdef ABI_ELF64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 typedef Elf64_Ehdr Elf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 typedef Elf64_Phdr Elf_Phdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 typedef Elf64_Shdr Elf_Shdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 typedef Elf64_Sym Elf_Sym;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 # ifndef OS_SunOS
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 typedef Elf64_Dyn Elf_Dyn;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 typedef Elf64_Sxword Elf_tag;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 typedef Elf64_Addr Elf_Addr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 # else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 typedef Elf32_Ehdr Elf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 typedef Elf32_Phdr Elf_Phdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 typedef Elf32_Shdr Elf_Shdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 typedef Elf32_Sym Elf_Sym;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 # ifndef OS_SunOS
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 typedef Elf32_Dyn Elf_Dyn;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 # endif
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 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 struct DLSyms_
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 const char* pStrTab;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 Elf_Sym* pSymTab;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 size_t strTabSize;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 size_t nSymbols;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 Elf_Ehdr* pElf_Ehdr; /* pointer to elf header */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 int file; /* fd of lib */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 size_t fileSize; /* filesize of open lib */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 DLSyms* dlSymsInit(const char* libPath)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 unsigned char* pMem;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 int i;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 struct stat st;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 Elf_Shdr* pS;
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
117 DLSyms* pSyms;
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
118
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
119 if(stat(libPath, &st) == -1)
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
120 return NULL;
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
121
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
122 i = open(libPath, O_RDONLY);
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
123 if(i == -1)
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
124 return NULL;
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
125
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
126 pSyms = (DLSyms*)dlAllocMem(sizeof(DLSyms));
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 memset(pSyms, 0, sizeof(DLSyms));
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
128 pSyms->file = i;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 pSyms->fileSize = st.st_size;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 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
131
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 #ifdef ABI_ELF32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS32);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS64);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 assert(pSyms->pElf_Ehdr->e_phoff > 0);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 assert(pSyms->pElf_Ehdr->e_shoff > 0);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 pMem = (unsigned char*)pSyms->pElf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 /* traverse section headers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 pS = (Elf_Shdr*) ( pMem + pSyms->pElf_Ehdr->e_shoff );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 /* skip section 0 which is always zero due to the Elf standard. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 for (i = 1; i < pSyms->pElf_Ehdr->e_shnum; i++)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 Elf_Shdr* pSection = &pS[i];
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
150 void* pSectionContent = ((char*)pMem) + pSection->sh_offset;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 switch (pSection->sh_type)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 case SHT_DYNSYM:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 if (!pSyms->pSymTab) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 pSyms->pSymTab = (Elf_Sym*)pSectionContent;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 pSyms->nSymbols = pSection->sh_size / pSection->sh_entsize;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 case SHT_STRTAB:
171
011b5e3a8548 - compatibility for older platforms - use ANSI comments
cslag
parents: 0
diff changeset
160 /* Do not trust pSyms->pElf_Ehdr->e_shstrndx! */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 if (!pSyms->pStrTab) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 pSyms->pStrTab = (const char*)pSectionContent;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 pSyms->strTabSize = pSection->sh_size;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 if (pSyms->pSymTab && pSyms->pStrTab)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 return pSyms;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 void dlSymsCleanup(DLSyms* pSyms)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 if(pSyms) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 munmap((void*) pSyms->pElf_Ehdr, pSyms->fileSize);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 close(pSyms->file);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 dlFreeMem(pSyms);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 int dlSymsCount(DLSyms* pSyms)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 {
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
186 return pSyms ? pSyms->nSymbols : 0;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 const char* dlSymsName(DLSyms* pSyms, int index)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 int str_index;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 if(!pSyms || !pSyms->pSymTab || index < 0 || index >= pSyms->nSymbols)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 return NULL;
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
195
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 str_index = pSyms->pSymTab[index].st_name;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 if (str_index < 0 || str_index >= pSyms->strTabSize)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 return NULL;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 return &pSyms->pStrTab[str_index];
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* dlSymsNameFromValue(DLSyms* pSyms, void* value)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 Dl_info info;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 return (dladdr(value, &info) && (value == info.dli_saddr))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 ? info.dli_sname
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 : NULL;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210