annotate dynload/dynload_syms_elf.c @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children 011b5e3a8548
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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2007-2015 Daniel Adler <dadler@uni-goettingen.de>,
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>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 #elif defined(OS_SunOS)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 # include <libelf.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 #elif defined(OS_BeOS)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 # include <elf32.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 # include <elf.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 #if defined(__GLIBC__)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 # define _GNU_SOURCE
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 # define __USE_GNU
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 #include "dynload_alloc.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 #include <assert.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 #include <fcntl.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 #include <dlfcn.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 #include <stdio.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 #include <string.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 #include <sys/stat.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 #include <sys/types.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 #include <sys/mman.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 #include <unistd.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 /* run-time configuration 64/32 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 #if defined(OS_OpenBSD)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 # include "../autovar/autovar_ABI.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 # ifdef ABI_ELF64
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;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 # ifndef OS_SunOS
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 # if defined(OS_BeOS)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 typedef struct Elf32_Ehdr Elf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 typedef struct Elf32_Phdr Elf_Phdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 typedef struct Elf32_Shdr Elf_Shdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 typedef struct Elf32_Sym Elf_Sym;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 typedef struct Elf32_Dyn Elf_Dyn;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 typedef Elf32_Sword Elf_tag;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 typedef Elf32_Addr Elf_Addr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 # else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 typedef Elf32_Ehdr Elf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 typedef Elf32_Phdr Elf_Phdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 typedef Elf32_Shdr Elf_Shdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 typedef Elf32_Sym Elf_Sym;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 # ifndef OS_SunOS
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 typedef Elf32_Dyn Elf_Dyn;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 typedef Elf32_Sword Elf_tag;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 typedef Elf32_Addr Elf_Addr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 #endif
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 struct DLSyms_
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 const char* pStrTab;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 Elf_Sym* pSymTab;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 size_t strTabSize;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 size_t nSymbols;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 Elf_Ehdr* pElf_Ehdr; /* pointer to elf header */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 int file; /* fd of lib */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 size_t fileSize; /* filesize of open lib */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 DLSyms* dlSymsInit(const char* libPath)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 unsigned char* pMem;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 void* pSectionContent;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 int i;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 struct stat st;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 Elf_Shdr* pS;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 DLSyms* pSyms = (DLSyms*)dlAllocMem(sizeof(DLSyms));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 memset(pSyms, 0, sizeof(DLSyms));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 pSyms->file = open(libPath, O_RDONLY);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 stat(libPath, &st);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 pSyms->fileSize = st.st_size;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 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
134
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 #ifdef ABI_ELF32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS32);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 assert(pSyms->pElf_Ehdr->e_ident[EI_CLASS] == ELFCLASS64);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 assert(pSyms->pElf_Ehdr->e_phoff > 0);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 assert(pSyms->pElf_Ehdr->e_shoff > 0);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 pMem = (unsigned char*)pSyms->pElf_Ehdr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 /* traverse section headers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 pS = (Elf_Shdr*) ( pMem + pSyms->pElf_Ehdr->e_shoff );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 /* skip section 0 which is always zero due to the Elf standard. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 for (i = 1; i < pSyms->pElf_Ehdr->e_shnum; i++)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 Elf_Shdr* pSection = &pS[i];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 pSectionContent = ((char*)pMem) + pSection->sh_offset;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 switch (pSection->sh_type)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 case SHT_DYNSYM:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 if (!pSyms->pSymTab) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 pSyms->pSymTab = (Elf_Sym*)pSectionContent;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 pSyms->nSymbols = pSection->sh_size / pSection->sh_entsize;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 case SHT_STRTAB:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 // Do not trust pSyms->pElf_Ehdr->e_shstrndx!
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 if (!pSyms->pStrTab) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 pSyms->pStrTab = (const char*)pSectionContent;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 pSyms->strTabSize = pSection->sh_size;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 }
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 if (pSyms->pSymTab && pSyms->pStrTab)
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 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 return 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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 void dlSymsCleanup(DLSyms* pSyms)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 if(pSyms) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 munmap((void*) pSyms->pElf_Ehdr, pSyms->fileSize);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 close(pSyms->file);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 dlFreeMem(pSyms);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 }
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 int dlSymsCount(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 return 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 return pSyms->nSymbols;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 }
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 const char* dlSymsName(DLSyms* pSyms, int index)
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 str_index;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 if(!pSyms || !pSyms->pSymTab || index < 0 || index >= pSyms->nSymbols)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 return NULL;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 str_index = pSyms->pSymTab[index].st_name;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 if (str_index < 0 || str_index >= pSyms->strTabSize)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 return NULL;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 return &pSyms->pStrTab[str_index];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 const char* dlSymsNameFromValue(DLSyms* pSyms, void* value)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 Dl_info info;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 return (dladdr(value, &info) && (value == info.dli_saddr))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 ? info.dli_sname
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 : NULL;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215