--- gdb-6.2.1-orig/gdb/dwarf2read.c 2004-09-28 04:15:54.094766232 +0400 +++ gdb-6.2.1/gdb/dwarf2read.c 2004-09-28 04:17:18.370954304 +0400 @@ -757,7 +757,7 @@ static struct line_header *(dwarf_decode_line_header (unsigned int offset, - bfd *abfd, struct dwarf2_cu *cu)); + bfd *abfd, struct dwarf2_cu *cu, const char* comp_dir)); static void dwarf_decode_lines (struct line_header *, char *, bfd *, struct dwarf2_cu *, struct partial_symtab *); @@ -1262,7 +1262,7 @@ bfd *abfd = objfile->obfd; struct line_header *lh; - lh = dwarf_decode_line_header (pdi->line_offset, abfd, cu); + lh = dwarf_decode_line_header (pdi->line_offset, abfd, cu, pst->dirname); if (lh == NULL) return; /* No linetable, so no includes. */ @@ -2397,7 +2397,7 @@ if (attr) { unsigned int line_offset = DW_UNSND (attr); - line_header = dwarf_decode_line_header (line_offset, abfd, cu); + line_header = dwarf_decode_line_header (line_offset, abfd, cu, comp_dir); if (line_header) { make_cleanup ((make_cleanup_ftype *) free_line_header, @@ -5665,6 +5665,23 @@ return follow_die_ref (dwarf2_get_ref_die_offset (spec_attr, cu)); } +/* Create full path name from absolute and relative parts. + The result string should be freed by caller when necessary. */ +static char* +make_full_path (const char *full_part, const char *rel_part) +{ + char *result; + + int dir_len = strlen(full_part); + + result = xmalloc(dir_len + 1 + strlen(rel_part) + 1); + strcpy (result, full_part); + result[dir_len] = '/'; + strcpy (result + dir_len + 1, rel_part); + + return result; +} + /* Free the line_header structure *LH, and any arrays and strings it refers to. */ static void @@ -5678,7 +5695,7 @@ if (lh->file_names) xfree (lh->file_names); - /* Similarly for the include directory names. */ + /* Similarly for the include directory names - they will be freed independently. */ if (lh->include_dirs) xfree (lh->include_dirs); @@ -5685,11 +5702,12 @@ xfree (lh); } - /* Add an entry to LH's include directory table. */ static void -add_include_dir (struct line_header *lh, char *include_dir) +add_include_dir (struct line_header *lh, char *include_dir, const char *comp_dir) { + char* real_dir; + /* Grow the array if necessary. */ if (lh->include_dirs_size == 0) { @@ -5705,7 +5723,17 @@ * sizeof (*lh->include_dirs))); } - lh->include_dirs[lh->num_include_dirs++] = include_dir; + if (!IS_ABSOLUTE_PATH(include_dir) && comp_dir != NULL) + { + real_dir = make_full_path(comp_dir, include_dir); + make_cleanup(xfree, real_dir); + } + else + { + real_dir = include_dir; + } + + lh->include_dirs[lh->num_include_dirs++] = real_dir; } @@ -5752,7 +5780,7 @@ freed. */ static struct line_header * dwarf_decode_line_header (unsigned int offset, bfd *abfd, - struct dwarf2_cu *cu) + struct dwarf2_cu *cu, const char* comp_dir) { struct cleanup *back_to; struct line_header *lh; @@ -5820,7 +5848,7 @@ while ((cur_dir = read_string (abfd, line_ptr, &bytes_read)) != NULL) { line_ptr += bytes_read; - add_include_dir (lh, cur_dir); + add_include_dir (lh, cur_dir, comp_dir); } line_ptr += bytes_read; @@ -8292,12 +8320,7 @@ if (dir) { - dir_len = strlen (dir); - full_name = xmalloc (dir_len + 1 + strlen (fe->name) + 1); - strcpy (full_name, dir); - full_name[dir_len] = '/'; - strcpy (full_name + dir_len + 1, fe->name); - return full_name; + return make_full_path(dir, fe->name); } else return xstrdup (fe->name);