mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-14 04:01:48 +00:00
libbacktrace: support FDPIC (1dd5c40)
This commit is contained in:
parent
0d0e56dca3
commit
e26c34346b
@ -725,8 +725,8 @@ struct dwarf_data
|
|||||||
struct dwarf_data *next;
|
struct dwarf_data *next;
|
||||||
/* The data for .gnu_debugaltlink. */
|
/* The data for .gnu_debugaltlink. */
|
||||||
struct dwarf_data *altlink;
|
struct dwarf_data *altlink;
|
||||||
/* The base address for this file. */
|
/* The base address mapping for this file. */
|
||||||
uintptr_t base_address;
|
struct libbacktrace_base_address base_address;
|
||||||
/* A sorted list of address ranges. */
|
/* A sorted list of address ranges. */
|
||||||
struct unit_addrs *addrs;
|
struct unit_addrs *addrs;
|
||||||
/* Number of address ranges in list. */
|
/* Number of address ranges in list. */
|
||||||
@ -1947,8 +1947,9 @@ update_pcrange (const struct attr* attr, const struct attr_val* val,
|
|||||||
static int
|
static int
|
||||||
add_low_high_range (struct backtrace_state *state,
|
add_low_high_range (struct backtrace_state *state,
|
||||||
const struct dwarf_sections *dwarf_sections,
|
const struct dwarf_sections *dwarf_sections,
|
||||||
uintptr_t base_address, int is_bigendian,
|
struct libbacktrace_base_address base_address,
|
||||||
struct unit *u, const struct pcrange *pcrange,
|
int is_bigendian, struct unit *u,
|
||||||
|
const struct pcrange *pcrange,
|
||||||
int (*add_range) (struct backtrace_state *state,
|
int (*add_range) (struct backtrace_state *state,
|
||||||
void *rdata, uintptr_t lowpc,
|
void *rdata, uintptr_t lowpc,
|
||||||
uintptr_t highpc,
|
uintptr_t highpc,
|
||||||
@ -1983,8 +1984,8 @@ add_low_high_range (struct backtrace_state *state,
|
|||||||
|
|
||||||
/* Add in the base address of the module when recording PC values,
|
/* Add in the base address of the module when recording PC values,
|
||||||
so that we can look up the PC directly. */
|
so that we can look up the PC directly. */
|
||||||
lowpc += base_address;
|
lowpc = libbacktrace_add_base (lowpc, base_address);
|
||||||
highpc += base_address;
|
highpc = libbacktrace_add_base (highpc, base_address);
|
||||||
|
|
||||||
return add_range (state, rdata, lowpc, highpc, error_callback, data, vec);
|
return add_range (state, rdata, lowpc, highpc, error_callback, data, vec);
|
||||||
}
|
}
|
||||||
@ -1996,7 +1997,7 @@ static int
|
|||||||
add_ranges_from_ranges (
|
add_ranges_from_ranges (
|
||||||
struct backtrace_state *state,
|
struct backtrace_state *state,
|
||||||
const struct dwarf_sections *dwarf_sections,
|
const struct dwarf_sections *dwarf_sections,
|
||||||
uintptr_t base_address, int is_bigendian,
|
struct libbacktrace_base_address base_address, int is_bigendian,
|
||||||
struct unit *u, uintptr_t base,
|
struct unit *u, uintptr_t base,
|
||||||
const struct pcrange *pcrange,
|
const struct pcrange *pcrange,
|
||||||
int (*add_range) (struct backtrace_state *state, void *rdata,
|
int (*add_range) (struct backtrace_state *state, void *rdata,
|
||||||
@ -2042,10 +2043,11 @@ add_ranges_from_ranges (
|
|||||||
base = (uintptr_t) high;
|
base = (uintptr_t) high;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!add_range (state, rdata,
|
uintptr_t rl, rh;
|
||||||
(uintptr_t) low + base + base_address,
|
|
||||||
(uintptr_t) high + base + base_address,
|
rl = libbacktrace_add_base ((uintptr_t) low + base, base_address);
|
||||||
error_callback, data, vec))
|
rh = libbacktrace_add_base ((uintptr_t) high + base, base_address);
|
||||||
|
if (!add_range (state, rdata, rl, rh, error_callback, data, vec))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2063,7 +2065,7 @@ static int
|
|||||||
add_ranges_from_rnglists (
|
add_ranges_from_rnglists (
|
||||||
struct backtrace_state *state,
|
struct backtrace_state *state,
|
||||||
const struct dwarf_sections *dwarf_sections,
|
const struct dwarf_sections *dwarf_sections,
|
||||||
uintptr_t base_address, int is_bigendian,
|
struct libbacktrace_base_address base_address, int is_bigendian,
|
||||||
struct unit *u, uintptr_t base,
|
struct unit *u, uintptr_t base,
|
||||||
const struct pcrange *pcrange,
|
const struct pcrange *pcrange,
|
||||||
int (*add_range) (struct backtrace_state *state, void *rdata,
|
int (*add_range) (struct backtrace_state *state, void *rdata,
|
||||||
@ -2146,9 +2148,10 @@ add_ranges_from_rnglists (
|
|||||||
u->addrsize, is_bigendian, index,
|
u->addrsize, is_bigendian, index,
|
||||||
error_callback, data, &high))
|
error_callback, data, &high))
|
||||||
return 0;
|
return 0;
|
||||||
if (!add_range (state, rdata, low + base_address,
|
if (!add_range (state, rdata,
|
||||||
high + base_address, error_callback, data,
|
libbacktrace_add_base (low, base_address),
|
||||||
vec))
|
libbacktrace_add_base (high, base_address),
|
||||||
|
error_callback, data, vec))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2165,7 +2168,7 @@ add_ranges_from_rnglists (
|
|||||||
error_callback, data, &low))
|
error_callback, data, &low))
|
||||||
return 0;
|
return 0;
|
||||||
length = read_uleb128 (&rnglists_buf);
|
length = read_uleb128 (&rnglists_buf);
|
||||||
low += base_address;
|
low = libbacktrace_add_base (low, base_address);
|
||||||
if (!add_range (state, rdata, low, low + length,
|
if (!add_range (state, rdata, low, low + length,
|
||||||
error_callback, data, vec))
|
error_callback, data, vec))
|
||||||
return 0;
|
return 0;
|
||||||
@ -2179,8 +2182,9 @@ add_ranges_from_rnglists (
|
|||||||
|
|
||||||
low = read_uleb128 (&rnglists_buf);
|
low = read_uleb128 (&rnglists_buf);
|
||||||
high = read_uleb128 (&rnglists_buf);
|
high = read_uleb128 (&rnglists_buf);
|
||||||
if (!add_range (state, rdata, low + base + base_address,
|
if (!add_range (state, rdata,
|
||||||
high + base + base_address,
|
libbacktrace_add_base (low + base, base_address),
|
||||||
|
libbacktrace_add_base (high + base, base_address),
|
||||||
error_callback, data, vec))
|
error_callback, data, vec))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2197,9 +2201,10 @@ add_ranges_from_rnglists (
|
|||||||
|
|
||||||
low = (uintptr_t) read_address (&rnglists_buf, u->addrsize);
|
low = (uintptr_t) read_address (&rnglists_buf, u->addrsize);
|
||||||
high = (uintptr_t) read_address (&rnglists_buf, u->addrsize);
|
high = (uintptr_t) read_address (&rnglists_buf, u->addrsize);
|
||||||
if (!add_range (state, rdata, low + base_address,
|
if (!add_range (state, rdata,
|
||||||
high + base_address, error_callback, data,
|
libbacktrace_add_base (low, base_address),
|
||||||
vec))
|
libbacktrace_add_base (high, base_address),
|
||||||
|
error_callback, data, vec))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2211,7 +2216,7 @@ add_ranges_from_rnglists (
|
|||||||
|
|
||||||
low = (uintptr_t) read_address (&rnglists_buf, u->addrsize);
|
low = (uintptr_t) read_address (&rnglists_buf, u->addrsize);
|
||||||
length = (uintptr_t) read_uleb128 (&rnglists_buf);
|
length = (uintptr_t) read_uleb128 (&rnglists_buf);
|
||||||
low += base_address;
|
low = libbacktrace_add_base (low, base_address);
|
||||||
if (!add_range (state, rdata, low, low + length,
|
if (!add_range (state, rdata, low, low + length,
|
||||||
error_callback, data, vec))
|
error_callback, data, vec))
|
||||||
return 0;
|
return 0;
|
||||||
@ -2239,7 +2244,7 @@ add_ranges_from_rnglists (
|
|||||||
static int
|
static int
|
||||||
add_ranges (struct backtrace_state *state,
|
add_ranges (struct backtrace_state *state,
|
||||||
const struct dwarf_sections *dwarf_sections,
|
const struct dwarf_sections *dwarf_sections,
|
||||||
uintptr_t base_address, int is_bigendian,
|
struct libbacktrace_base_address base_address, int is_bigendian,
|
||||||
struct unit *u, uintptr_t base, const struct pcrange *pcrange,
|
struct unit *u, uintptr_t base, const struct pcrange *pcrange,
|
||||||
int (*add_range) (struct backtrace_state *state, void *rdata,
|
int (*add_range) (struct backtrace_state *state, void *rdata,
|
||||||
uintptr_t lowpc, uintptr_t highpc,
|
uintptr_t lowpc, uintptr_t highpc,
|
||||||
@ -2275,7 +2280,8 @@ add_ranges (struct backtrace_state *state,
|
|||||||
read, 0 if there is some error. */
|
read, 0 if there is some error. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
|
find_address_ranges (struct backtrace_state *state,
|
||||||
|
struct libbacktrace_base_address base_address,
|
||||||
struct dwarf_buf *unit_buf,
|
struct dwarf_buf *unit_buf,
|
||||||
const struct dwarf_sections *dwarf_sections,
|
const struct dwarf_sections *dwarf_sections,
|
||||||
int is_bigendian, struct dwarf_data *altlink,
|
int is_bigendian, struct dwarf_data *altlink,
|
||||||
@ -2430,7 +2436,8 @@ find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
|
|||||||
on success, 0 on failure. */
|
on success, 0 on failure. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
build_address_map (struct backtrace_state *state, uintptr_t base_address,
|
build_address_map (struct backtrace_state *state,
|
||||||
|
struct libbacktrace_base_address base_address,
|
||||||
const struct dwarf_sections *dwarf_sections,
|
const struct dwarf_sections *dwarf_sections,
|
||||||
int is_bigendian, struct dwarf_data *altlink,
|
int is_bigendian, struct dwarf_data *altlink,
|
||||||
backtrace_error_callback error_callback, void *data,
|
backtrace_error_callback error_callback, void *data,
|
||||||
@ -2649,7 +2656,7 @@ add_line (struct backtrace_state *state, struct dwarf_data *ddata,
|
|||||||
|
|
||||||
/* Add in the base address here, so that we can look up the PC
|
/* Add in the base address here, so that we can look up the PC
|
||||||
directly. */
|
directly. */
|
||||||
ln->pc = pc + ddata->base_address;
|
ln->pc = libbacktrace_add_base (pc, ddata->base_address);
|
||||||
|
|
||||||
ln->filename = filename;
|
ln->filename = filename;
|
||||||
ln->lineno = lineno;
|
ln->lineno = lineno;
|
||||||
@ -4329,7 +4336,7 @@ dwarf_fileline (struct backtrace_state *state, uintptr_t pc,
|
|||||||
|
|
||||||
static struct dwarf_data *
|
static struct dwarf_data *
|
||||||
build_dwarf_data (struct backtrace_state *state,
|
build_dwarf_data (struct backtrace_state *state,
|
||||||
uintptr_t base_address,
|
struct libbacktrace_base_address base_address,
|
||||||
const struct dwarf_sections *dwarf_sections,
|
const struct dwarf_sections *dwarf_sections,
|
||||||
int is_bigendian,
|
int is_bigendian,
|
||||||
struct dwarf_data *altlink,
|
struct dwarf_data *altlink,
|
||||||
@ -4387,7 +4394,7 @@ build_dwarf_data (struct backtrace_state *state,
|
|||||||
|
|
||||||
int
|
int
|
||||||
backtrace_dwarf_add (struct backtrace_state *state,
|
backtrace_dwarf_add (struct backtrace_state *state,
|
||||||
uintptr_t base_address,
|
struct libbacktrace_base_address base_address,
|
||||||
const struct dwarf_sections *dwarf_sections,
|
const struct dwarf_sections *dwarf_sections,
|
||||||
int is_bigendian,
|
int is_bigendian,
|
||||||
struct dwarf_data *fileline_altlink,
|
struct dwarf_data *fileline_altlink,
|
||||||
|
@ -643,7 +643,7 @@ elf_symbol_search (const void *vkey, const void *ventry)
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
elf_initialize_syminfo (struct backtrace_state *state,
|
elf_initialize_syminfo (struct backtrace_state *state,
|
||||||
uintptr_t base_address,
|
struct libbacktrace_base_address base_address,
|
||||||
const unsigned char *symtab_data, size_t symtab_size,
|
const unsigned char *symtab_data, size_t symtab_size,
|
||||||
const unsigned char *strtab, size_t strtab_size,
|
const unsigned char *strtab, size_t strtab_size,
|
||||||
backtrace_error_callback error_callback,
|
backtrace_error_callback error_callback,
|
||||||
@ -709,7 +709,8 @@ elf_initialize_syminfo (struct backtrace_state *state,
|
|||||||
= *(const b_elf_addr *) (opd->data + (sym->st_value - opd->addr));
|
= *(const b_elf_addr *) (opd->data + (sym->st_value - opd->addr));
|
||||||
else
|
else
|
||||||
elf_symbols[j].address = sym->st_value;
|
elf_symbols[j].address = sym->st_value;
|
||||||
elf_symbols[j].address += base_address;
|
elf_symbols[j].address =
|
||||||
|
libbacktrace_add_base (elf_symbols[j].address, base_address);
|
||||||
elf_symbols[j].size = sym->st_size;
|
elf_symbols[j].size = sym->st_size;
|
||||||
++j;
|
++j;
|
||||||
}
|
}
|
||||||
@ -6517,7 +6518,8 @@ backtrace_uncompress_lzma (struct backtrace_state *state,
|
|||||||
static int
|
static int
|
||||||
elf_add (struct backtrace_state *state, const char *filename, int descriptor,
|
elf_add (struct backtrace_state *state, const char *filename, int descriptor,
|
||||||
const unsigned char *memory, size_t memory_size,
|
const unsigned char *memory, size_t memory_size,
|
||||||
uintptr_t base_address, struct elf_ppc64_opd_data *caller_opd,
|
struct libbacktrace_base_address base_address,
|
||||||
|
struct elf_ppc64_opd_data *caller_opd,
|
||||||
backtrace_error_callback error_callback, void *data,
|
backtrace_error_callback error_callback, void *data,
|
||||||
fileline *fileline_fn, int *found_sym, int *found_dwarf,
|
fileline *fileline_fn, int *found_sym, int *found_dwarf,
|
||||||
struct dwarf_data **fileline_entry, int exe, int debuginfo,
|
struct dwarf_data **fileline_entry, int exe, int debuginfo,
|
||||||
@ -7419,6 +7421,7 @@ phdr_callback (struct PhdrIterate *info, void *pdata)
|
|||||||
const char *filename;
|
const char *filename;
|
||||||
int descriptor;
|
int descriptor;
|
||||||
int does_not_exist;
|
int does_not_exist;
|
||||||
|
struct libbacktrace_base_address base_address;
|
||||||
fileline elf_fileline_fn;
|
fileline elf_fileline_fn;
|
||||||
int found_dwarf;
|
int found_dwarf;
|
||||||
|
|
||||||
@ -7448,7 +7451,8 @@ phdr_callback (struct PhdrIterate *info, void *pdata)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (elf_add (pd->state, filename, descriptor, NULL, 0, info->dlpi_addr, NULL,
|
base_address.m = info->dlpi_addr;
|
||||||
|
if (elf_add (pd->state, filename, descriptor, NULL, 0, base_address, NULL,
|
||||||
pd->error_callback, pd->data, &elf_fileline_fn, pd->found_sym,
|
pd->error_callback, pd->data, &elf_fileline_fn, pd->found_sym,
|
||||||
&found_dwarf, NULL, 0, 0, NULL, 0))
|
&found_dwarf, NULL, 0, 0, NULL, 0))
|
||||||
{
|
{
|
||||||
@ -7537,11 +7541,21 @@ backtrace_initialize (struct backtrace_state *state, const char *filename,
|
|||||||
fileline elf_fileline_fn = elf_nodebug;
|
fileline elf_fileline_fn = elf_nodebug;
|
||||||
struct phdr_data pd;
|
struct phdr_data pd;
|
||||||
|
|
||||||
ret = elf_add (state, filename, descriptor, NULL, 0, 0, NULL, error_callback,
|
|
||||||
data, &elf_fileline_fn, &found_sym, &found_dwarf, NULL, 1, 0,
|
/* When using fdpic we must use dl_iterate_phdr for all modules, including
|
||||||
NULL, 0);
|
the main executable, so that we can get the right base address
|
||||||
if (!ret)
|
mapping. */
|
||||||
return 0;
|
if (!libbacktrace_using_fdpic ())
|
||||||
|
{
|
||||||
|
struct libbacktrace_base_address zero_base_address;
|
||||||
|
|
||||||
|
memset (&zero_base_address, 0, sizeof zero_base_address);
|
||||||
|
ret = elf_add (state, filename, descriptor, NULL, 0, zero_base_address,
|
||||||
|
NULL, error_callback, data, &elf_fileline_fn, &found_sym,
|
||||||
|
&found_dwarf, NULL, 1, 0, NULL, 0);
|
||||||
|
if (!ret)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
pd.state = state;
|
pd.state = state;
|
||||||
pd.error_callback = error_callback;
|
pd.error_callback = error_callback;
|
||||||
|
@ -333,10 +333,44 @@ struct dwarf_sections
|
|||||||
|
|
||||||
struct dwarf_data;
|
struct dwarf_data;
|
||||||
|
|
||||||
|
/* The load address mapping. */
|
||||||
|
|
||||||
|
#if defined(__FDPIC__) && defined(HAVE_DL_ITERATE_PHDR) && (defined(HAVE_LINK_H) || defined(HAVE_SYS_LINK_H))
|
||||||
|
|
||||||
|
#ifdef HAVE_LINK_H
|
||||||
|
#include <link.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_LINK_H
|
||||||
|
#include <sys/link.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define libbacktrace_using_fdpic() (1)
|
||||||
|
|
||||||
|
struct libbacktrace_base_address
|
||||||
|
{
|
||||||
|
struct elf32_fdpic_loadaddr m;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define libbacktrace_add_base(pc, base) \
|
||||||
|
((uintptr_t) (__RELOC_POINTER ((pc), (base).m)))
|
||||||
|
|
||||||
|
#else /* not _FDPIC__ */
|
||||||
|
|
||||||
|
#define libbacktrace_using_fdpic() (0)
|
||||||
|
|
||||||
|
struct libbacktrace_base_address
|
||||||
|
{
|
||||||
|
uintptr_t m;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define libbacktrace_add_base(pc, base) ((pc) + (base).m)
|
||||||
|
|
||||||
|
#endif /* not _FDPIC__ */
|
||||||
|
|
||||||
/* Add file/line information for a DWARF module. */
|
/* Add file/line information for a DWARF module. */
|
||||||
|
|
||||||
extern int backtrace_dwarf_add (struct backtrace_state *state,
|
extern int backtrace_dwarf_add (struct backtrace_state *state,
|
||||||
uintptr_t base_address,
|
struct libbacktrace_base_address base_address,
|
||||||
const struct dwarf_sections *dwarf_sections,
|
const struct dwarf_sections *dwarf_sections,
|
||||||
int is_bigendian,
|
int is_bigendian,
|
||||||
struct dwarf_data *fileline_altlink,
|
struct dwarf_data *fileline_altlink,
|
||||||
|
@ -318,8 +318,9 @@ static const char * const dwarf_section_names[DEBUG_MAX] =
|
|||||||
/* Forward declaration. */
|
/* Forward declaration. */
|
||||||
|
|
||||||
static int macho_add (struct backtrace_state *, const char *, int, off_t,
|
static int macho_add (struct backtrace_state *, const char *, int, off_t,
|
||||||
const unsigned char *, uintptr_t, int,
|
const unsigned char *, struct libbacktrace_base_address,
|
||||||
backtrace_error_callback, void *, fileline *, int *);
|
int, backtrace_error_callback, void *, fileline *,
|
||||||
|
int *);
|
||||||
|
|
||||||
/* A dummy callback function used when we can't find any debug info. */
|
/* A dummy callback function used when we can't find any debug info. */
|
||||||
|
|
||||||
@ -514,7 +515,7 @@ macho_defined_symbol (uint8_t type)
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
macho_add_symtab (struct backtrace_state *state, int descriptor,
|
macho_add_symtab (struct backtrace_state *state, int descriptor,
|
||||||
uintptr_t base_address, int is_64,
|
struct libbacktrace_base_address base_address, int is_64,
|
||||||
off_t symoff, unsigned int nsyms, off_t stroff,
|
off_t symoff, unsigned int nsyms, off_t stroff,
|
||||||
unsigned int strsize,
|
unsigned int strsize,
|
||||||
backtrace_error_callback error_callback, void *data)
|
backtrace_error_callback error_callback, void *data)
|
||||||
@ -629,7 +630,7 @@ macho_add_symtab (struct backtrace_state *state, int descriptor,
|
|||||||
if (name[0] == '_')
|
if (name[0] == '_')
|
||||||
++name;
|
++name;
|
||||||
macho_symbols[j].name = name;
|
macho_symbols[j].name = name;
|
||||||
macho_symbols[j].address = value + base_address;
|
macho_symbols[j].address = libbacktrace_add_base (value, base_address);
|
||||||
++j;
|
++j;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -762,7 +763,8 @@ macho_syminfo (struct backtrace_state *state, uintptr_t addr,
|
|||||||
static int
|
static int
|
||||||
macho_add_fat (struct backtrace_state *state, const char *filename,
|
macho_add_fat (struct backtrace_state *state, const char *filename,
|
||||||
int descriptor, int swapped, off_t offset,
|
int descriptor, int swapped, off_t offset,
|
||||||
const unsigned char *match_uuid, uintptr_t base_address,
|
const unsigned char *match_uuid,
|
||||||
|
struct libbacktrace_base_address base_address,
|
||||||
int skip_symtab, uint32_t nfat_arch, int is_64,
|
int skip_symtab, uint32_t nfat_arch, int is_64,
|
||||||
backtrace_error_callback error_callback, void *data,
|
backtrace_error_callback error_callback, void *data,
|
||||||
fileline *fileline_fn, int *found_sym)
|
fileline *fileline_fn, int *found_sym)
|
||||||
@ -864,7 +866,8 @@ macho_add_fat (struct backtrace_state *state, const char *filename,
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
macho_add_dsym (struct backtrace_state *state, const char *filename,
|
macho_add_dsym (struct backtrace_state *state, const char *filename,
|
||||||
uintptr_t base_address, const unsigned char *uuid,
|
struct libbacktrace_base_address base_address,
|
||||||
|
const unsigned char *uuid,
|
||||||
backtrace_error_callback error_callback, void *data,
|
backtrace_error_callback error_callback, void *data,
|
||||||
fileline* fileline_fn)
|
fileline* fileline_fn)
|
||||||
{
|
{
|
||||||
@ -982,7 +985,7 @@ macho_add_dsym (struct backtrace_state *state, const char *filename,
|
|||||||
static int
|
static int
|
||||||
macho_add (struct backtrace_state *state, const char *filename, int descriptor,
|
macho_add (struct backtrace_state *state, const char *filename, int descriptor,
|
||||||
off_t offset, const unsigned char *match_uuid,
|
off_t offset, const unsigned char *match_uuid,
|
||||||
uintptr_t base_address, int skip_symtab,
|
struct libbacktrace_base_address base_address, int skip_symtab,
|
||||||
backtrace_error_callback error_callback, void *data,
|
backtrace_error_callback error_callback, void *data,
|
||||||
fileline *fileline_fn, int *found_sym)
|
fileline *fileline_fn, int *found_sym)
|
||||||
{
|
{
|
||||||
@ -1244,7 +1247,7 @@ backtrace_initialize (struct backtrace_state *state, const char *filename,
|
|||||||
c = _dyld_image_count ();
|
c = _dyld_image_count ();
|
||||||
for (i = 0; i < c; ++i)
|
for (i = 0; i < c; ++i)
|
||||||
{
|
{
|
||||||
uintptr_t base_address;
|
struct libbacktrace_base_address base_address;
|
||||||
const char *name;
|
const char *name;
|
||||||
int d;
|
int d;
|
||||||
fileline mff;
|
fileline mff;
|
||||||
@ -1268,7 +1271,7 @@ backtrace_initialize (struct backtrace_state *state, const char *filename,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
base_address = _dyld_get_image_vmaddr_slide (i);
|
base_address.m = _dyld_get_image_vmaddr_slide (i);
|
||||||
|
|
||||||
mff = macho_nodebug;
|
mff = macho_nodebug;
|
||||||
if (!macho_add (state, name, d, 0, NULL, base_address, 0,
|
if (!macho_add (state, name, d, 0, NULL, base_address, 0,
|
||||||
@ -1323,10 +1326,12 @@ backtrace_initialize (struct backtrace_state *state, const char *filename,
|
|||||||
void *data, fileline *fileline_fn)
|
void *data, fileline *fileline_fn)
|
||||||
{
|
{
|
||||||
fileline macho_fileline_fn;
|
fileline macho_fileline_fn;
|
||||||
|
struct libbacktrace_base_address zero_base_address;
|
||||||
int found_sym;
|
int found_sym;
|
||||||
|
|
||||||
macho_fileline_fn = macho_nodebug;
|
macho_fileline_fn = macho_nodebug;
|
||||||
if (!macho_add (state, filename, descriptor, 0, NULL, 0, 0,
|
memset (&zero_base_address, 0, sizeof zero_base_address);
|
||||||
|
if (!macho_add (state, filename, descriptor, 0, NULL, zero_base_address, 0,
|
||||||
error_callback, data, &macho_fileline_fn, &found_sym))
|
error_callback, data, &macho_fileline_fn, &found_sym))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user