| Index: native_client_sdk/src/libraries/xray/symtable.c
|
| ===================================================================
|
| --- native_client_sdk/src/libraries/xray/symtable.c (revision 208986)
|
| +++ native_client_sdk/src/libraries/xray/symtable.c (working copy)
|
| @@ -5,10 +5,16 @@
|
|
|
| /* XRay symbol table */
|
|
|
| +#define _GNU_SOURCE
|
| #include <stdint.h>
|
| #include <stdio.h>
|
| #include <stdlib.h>
|
| #include <string.h>
|
| +
|
| +#if defined(__GLIBC__)
|
| +#include <dlfcn.h>
|
| +#endif
|
| +
|
| #include "xray/xray_priv.h"
|
|
|
| #if defined(XRAY)
|
| @@ -111,23 +117,41 @@
|
| return (struct XRaySymbol*)XRayHashTableAtIndex(symtab->hash_table, i);
|
| }
|
|
|
| +struct XRaySymbol* XRaySymbolTableAdd(struct XRaySymbolTable* symtab,
|
| + struct XRaySymbol* symbol,
|
| + uint32_t addr) {
|
| + return (struct XRaySymbol*)
|
| + XRayHashTableInsert(symtab->hash_table, symbol, addr);
|
| +}
|
|
|
| +struct XRaySymbol* XRaySymbolTableAddByName(struct XRaySymbolTable* symtab,
|
| + const char* name, uint32_t addr) {
|
| + char* recorded_symbol;
|
| + struct XRaySymbol* symbol;
|
| + /* copy the symbol name into the string pool */
|
| + recorded_symbol = XRayStringPoolAppend(symtab->string_pool, name);
|
| + if (g_symtable_debug)
|
| + printf("adding symbol %s\n", recorded_symbol);
|
| + /* construct a symbol and put it in the symbol table */
|
| + symbol = XRaySymbolCreate(symtab->symbol_pool, recorded_symbol);
|
| + return XRaySymbolTableAdd(symtab, symbol, addr);
|
| +}
|
| +
|
| struct XRaySymbol* XRaySymbolTableLookup(struct XRaySymbolTable* symtab,
|
| uint32_t addr) {
|
| void *x = XRayHashTableLookup(symtab->hash_table, addr);
|
| struct XRaySymbol* r = (struct XRaySymbol*)x;
|
| +#if defined(__GLIBC__)
|
| + if (r == NULL) {
|
| + Dl_info info;
|
| + if (dladdr((const void*)addr, &info) != 0)
|
| + if (info.dli_sname)
|
| + r = XRaySymbolTableAddByName(symtab, info.dli_sname, addr);
|
| + }
|
| +#endif
|
| return r;
|
| }
|
|
|
| -
|
| -struct XRaySymbol* XRaySymbolTableAdd(struct XRaySymbolTable* symtab,
|
| - struct XRaySymbol* symbol,
|
| - uint32_t addr) {
|
| - return (struct XRaySymbol*)
|
| - XRayHashTableInsert(symtab->hash_table, symbol, addr);
|
| -}
|
| -
|
| -
|
| struct XRaySymbol* XRaySymbolTableCreateEntry(struct XRaySymbolTable* symtab,
|
| const char* line) {
|
| uint32_t addr;
|
| @@ -135,8 +159,6 @@
|
| char symbol_text[XRAY_LINE_SIZE];
|
| char* parsed_symbol;
|
| char* newln;
|
| - struct XRaySymbol* symbol;
|
| - char* recorded_symbol;
|
| sscanf(line,"%x %s", &uiaddr, symbol_text);
|
| if (uiaddr > 0x07FFFFFF) {
|
| printf("While parsing the mapfile, XRay encountered:\n");
|
| @@ -151,13 +173,7 @@
|
| if (NULL != newln) {
|
| *newln = 0;
|
| }
|
| - /* copy the parsed symbol name into the string pool */
|
| - recorded_symbol = XRayStringPoolAppend(symtab->string_pool, parsed_symbol);
|
| - if (g_symtable_debug)
|
| - printf("adding symbol %s\n", recorded_symbol);
|
| - /* construct a symbol and put it in the symbol table */
|
| - symbol = XRaySymbolCreate(symtab->symbol_pool, recorded_symbol);
|
| - return XRaySymbolTableAdd(symtab, symbol, addr);
|
| + return XRaySymbolTableAddByName(symtab, parsed_symbol, addr);
|
| }
|
|
|
|
|
|
|