annotate dynload/dynload_syms_elf.c @ 663:127b569978cc default tip

- another tweak handling clang trying to be too smart (see last commit)
author Tassilo Philipp
date Sun, 24 Mar 2024 13:52:44 +0100
parents 6a8aac9b2bcf
children
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
645
6a8aac9b2bcf - removal of `autovar` macro detection lib:
Tassilo Philipp
parents: 396
diff changeset
29 #include "../dyncall/dyncall_macros.h"
0
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"
645
6a8aac9b2bcf - removal of `autovar` macro detection lib:
Tassilo Philipp
parents: 396
diff changeset
38 #if defined(DC__OS_OpenBSD)
0
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>
645
6a8aac9b2bcf - removal of `autovar` macro detection lib:
Tassilo Philipp
parents: 396
diff changeset
41 #elif defined(DC__OS_NetBSD)
207
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>
645
6a8aac9b2bcf - removal of `autovar` macro detection lib:
Tassilo Philipp
parents: 396
diff changeset
44 #elif defined(DC__OS_SunOS)
0
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 */
645
6a8aac9b2bcf - removal of `autovar` macro detection lib:
Tassilo Philipp
parents: 396
diff changeset
68 #if defined(DC__OS_OpenBSD)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 #else
645
6a8aac9b2bcf - removal of `autovar` macro detection lib:
Tassilo Philipp
parents: 396
diff changeset
70 # ifdef DC__Obj_ELF64
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 typedef Elf64_Ehdr Elf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 typedef Elf64_Phdr Elf_Phdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 typedef Elf64_Shdr Elf_Shdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 typedef Elf64_Sym Elf_Sym;
645
6a8aac9b2bcf - removal of `autovar` macro detection lib:
Tassilo Philipp
parents: 396
diff changeset
76 # ifndef DC__OS_SunOS
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 typedef Elf64_Dyn Elf_Dyn;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 typedef Elf64_Sxword Elf_tag;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 typedef Elf64_Addr Elf_Addr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 # else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 typedef Elf32_Ehdr Elf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 typedef Elf32_Phdr Elf_Phdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 typedef Elf32_Shdr Elf_Shdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 typedef Elf32_Sym Elf_Sym;
645
6a8aac9b2bcf - removal of `autovar` macro detection lib:
Tassilo Philipp
parents: 396
diff changeset
88 # ifndef DC__OS_SunOS
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 typedef Elf32_Dyn Elf_Dyn;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 typedef Elf32_Sword Elf_tag;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 typedef Elf32_Addr Elf_Addr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 # endif
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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 struct DLSyms_
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 const char* pStrTab;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 Elf_Sym* pSymTab;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 size_t strTabSize;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 size_t nSymbols;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 Elf_Ehdr* pElf_Ehdr; /* pointer to elf header */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 int file; /* fd of lib */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 size_t fileSize; /* filesize of open lib */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 };
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 DLSyms* dlSymsInit(const char* libPath)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 unsigned char* pMem;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 int i;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 struct stat st;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 Elf_Shdr* pS;
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
116 DLSyms* pSyms;
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
117
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
118 if(stat(libPath, &st) == -1)
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
119 return NULL;
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
120
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
121 i = open(libPath, O_RDONLY);
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
122 if(i == -1)
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
123 return NULL;
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
124
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
125 pSyms = (DLSyms*)dlAllocMem(sizeof(DLSyms));
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 memset(pSyms, 0, sizeof(DLSyms));
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
127 pSyms->file = i;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 pSyms->fileSize = st.st_size;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 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
130
645
6a8aac9b2bcf - removal of `autovar` macro detection lib:
Tassilo Philipp
parents: 396
diff changeset
131 #ifdef DC__Obj_ELF32
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS32);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS64);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 assert(pSyms->pElf_Ehdr->e_phoff > 0);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 assert(pSyms->pElf_Ehdr->e_shoff > 0);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 pMem = (unsigned char*)pSyms->pElf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 /* traverse section headers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 pS = (Elf_Shdr*) ( pMem + pSyms->pElf_Ehdr->e_shoff );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 /* skip section 0 which is always zero due to the Elf standard. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 for (i = 1; i < pSyms->pElf_Ehdr->e_shnum; i++)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 Elf_Shdr* pSection = &pS[i];
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
149 void* pSectionContent = ((char*)pMem) + pSection->sh_offset;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 switch (pSection->sh_type)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 case SHT_DYNSYM:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 if (!pSyms->pSymTab) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 pSyms->pSymTab = (Elf_Sym*)pSectionContent;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 pSyms->nSymbols = pSection->sh_size / pSection->sh_entsize;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 case SHT_STRTAB:
171
011b5e3a8548 - compatibility for older platforms - use ANSI comments
cslag
parents: 0
diff changeset
159 /* Do not trust pSyms->pElf_Ehdr->e_shstrndx! */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 if (!pSyms->pStrTab) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 pSyms->pStrTab = (const char*)pSectionContent;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 pSyms->strTabSize = pSection->sh_size;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 if (pSyms->pSymTab && pSyms->pStrTab)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 return pSyms;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 }
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 void dlSymsCleanup(DLSyms* pSyms)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 if(pSyms) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 munmap((void*) pSyms->pElf_Ehdr, pSyms->fileSize);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 close(pSyms->file);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 dlFreeMem(pSyms);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 }
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 int dlSymsCount(DLSyms* pSyms)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 {
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
185 return pSyms ? pSyms->nSymbols : 0;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186 }
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 const char* dlSymsName(DLSyms* pSyms, int index)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 int str_index;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 if(!pSyms || !pSyms->pSymTab || index < 0 || index >= pSyms->nSymbols)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 return NULL;
231
1d774010ddb9 - dynload_syms_elf.c cleanup
Tassilo Philipp
parents: 207
diff changeset
194
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 str_index = pSyms->pSymTab[index].st_name;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 if (str_index < 0 || str_index >= pSyms->strTabSize)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 return NULL;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 return &pSyms->pStrTab[str_index];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 }
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 const char* dlSymsNameFromValue(DLSyms* pSyms, void* value)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 Dl_info info;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 return (dladdr(value, &info) && (value == info.dli_saddr))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 ? info.dli_sname
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 : NULL;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209