diff options
Diffstat (limited to 'addr2line.c')
| -rw-r--r-- | addr2line.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/addr2line.c b/addr2line.c index b783e8e470..19a6a425c1 100644 --- a/addr2line.c +++ b/addr2line.c @@ -296,9 +296,11 @@ fill_filename(int file, uint8_t format, uint16_t version, const char *include_di for (i = 1; i <= file; i++) { filename = p; if (!*p) { +#ifndef __APPLE__ /* Need to output binary file name? */ kprintf("Unexpected file number %d in %s at %tx\n", file, binary_filename, filenames - obj->mapped); +#endif return; } while (*p) p++; @@ -635,12 +637,13 @@ follow_debuglink_build_id(const char *build_id, size_t build_id_size, int num_tr obj_info_t **objp, line_info_t *lines, int offset, FILE *errout) { static const char global_debug_dir[] = "/usr/lib/debug/.build-id/"; + static const char debug_suffix[] = ".debug"; const size_t global_debug_dir_len = sizeof(global_debug_dir) - 1; char *p; obj_info_t *o1 = *objp, *o2; size_t i; - if (PATH_MAX < global_debug_dir_len + 1 + build_id_size * 2 + 6) return; + if (PATH_MAX < global_debug_dir_len + build_id_size * 2 + sizeof(debug_suffix)) return; memcpy(binary_filename, global_debug_dir, global_debug_dir_len); p = binary_filename + global_debug_dir_len; @@ -651,7 +654,7 @@ follow_debuglink_build_id(const char *build_id, size_t build_id_size, int num_tr *p++ = tbl[n % 16]; if (i == 0) *p++ = '/'; } - strcpy(p, ".debug"); + memcpy(p, debug_suffix, sizeof(debug_suffix)); append_obj(objp); o2 = *objp; @@ -2173,9 +2176,8 @@ fill_lines(int num_traces, void **traces, int check_debuglink, } } - if (offset == -1) { + if (offset == 0) { /* main executable */ - offset = 0; if (dynsym_shdr && dynstr_shdr) { char *strtab = file + dynstr_shdr->sh_offset; ElfW(Sym) *symtab = (ElfW(Sym) *)(file + dynsym_shdr->sh_offset); |
