#include <unistd.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <elf.h>
#include <errno.h>
#include <inttypes.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include "epicsMutex.h"
#include "epicsThread.h"
#include "epicsTime.h"
#include "errlog.h"
#include "epicsStackTrace.h"
#include "epicsStackTracePvt.h"
Go to the source code of this file.
|
#define | FIND_ADDR_DEBUG 0 |
|
#define | FLD(c, s, f) (ELFCLASS32==c ? s.e32.f : s.e64.f ) |
|
#define | ARR(c, s, i, f) (ELFCLASS32==c ? s.e32[i].f : s.e64[i].f) |
|
#define ARR |
( |
|
c, |
|
|
|
s, |
|
|
|
i, |
|
|
|
f |
|
) |
| (ELFCLASS32==c ? s.e32[i].f : s.e64[i].f) |
#define FIND_ADDR_DEBUG 0 |
#define FLD |
( |
|
c, |
|
|
|
s, |
|
|
|
f |
|
) |
| (ELFCLASS32==c ? s.e32.f : s.e64.f ) |
Definition at line 518 of file osdElfFindAddr.c.
522 uintptr_t minoff,off;
530 if ( ! dladdr(addr, &inf) || (!inf.dli_fname && !inf.dli_sname) ) {
537 sym_p->
f_nam = inf.dli_fname;
541 if ( (sym_p->
s_nam = inf.dli_sname) ) {
542 sym_p->
s_val = inf.dli_saddr;
553 es = elfSymsFind(inf.dli_fname);
559 if ( ! (nes = elfRead(inf.dli_fname, (uintptr_t)inf.dli_fbase)) ) {
567 es = elfSymsFind(inf.dli_fname);
582 elfSymsDestroy( nes );
585 minoff = (uintptr_t)-1LL;
596 #if (FIND_ADDR_DEBUG & 1) 597 printf(
"Looking for %p\n", addr);
600 if ( ELFCLASS32 == c ) {
601 for ( i=0; i<es->
nsyms; i++ ) {
602 if ( STT_FUNC != ELF32_ST_TYPE(sym.
e32[i].st_info) )
605 if ( 0 == sym.
e32[i].st_shndx )
607 #if (FIND_ADDR_DEBUG & 1) 608 printf(
"Trying: %s (0x%lx)\n", strtab + sym.
e32[i].st_name, (
unsigned long)(sym.
e32[i].st_value + es->
addr));
610 if ( (uintptr_t)addr >= (uintptr_t)sym.
e32[i].st_value + es->
addr ) {
611 off = (uintptr_t)addr - ((uintptr_t)sym.
e32[
i].st_value + es->
addr);
612 if ( off < minoff ) {
619 for ( i=0; i<es->
nsyms; i++ ) {
620 if ( STT_FUNC != ELF64_ST_TYPE(sym.
e64[i].st_info) )
623 if ( 0 == sym.
e64[i].st_shndx )
625 #if (FIND_ADDR_DEBUG & 1) 626 printf(
"Trying: %s (0x%llx)\n", strtab + sym.
e64[i].st_name, (
unsigned long long)(sym.
e64[i].st_value + es->
addr));
628 if ( (uintptr_t)addr >= (uintptr_t)sym.
e64[i].st_value + es->
addr ) {
629 off = (uintptr_t)addr - ((uintptr_t)sym.
e64[
i].st_value + es->
addr);
630 if ( off < minoff ) {
639 if ( nearest.
raw && ( (idx =
ARR(c,nearest,0,st_name)) < es->
strMap->
max ) ) {
640 sym_p->
s_nam = strtab + idx;
641 sym_p->
s_val = (
char*)
ARR(c, nearest, 0, st_value) + es->
addr;
int epicsFindAddrGetFeatures |
( |
void |
| ) |
|
Definition at line 647 of file osdElfFindAddr.c.
#define EPICS_STACKTRACE_LCL_SYMBOLS
#define EPICS_STACKTRACE_GBL_SYMBOLS
#define EPICS_STACKTRACE_DYN_SYMBOLS