debugedit: Only try to collect comp_dir in phase zero.
edit_attributes is run twice. Once for phase zero in which all strings are collected. Then then for phase one in which the strings are rewritten. In phase zero we also try to collect the comp_dir (either from the DW_AT_comp_dir or the DW_AT_name of the compile unit). We were also collecting the comp_dir is phase 1, which is unnecessary, and would not actually work, since we would be using to old string table index for that, which had already been rewritten. Caught by the new string table index checks. Signed-off-by: Mark Wielaard <mark@klomp.org>
This commit is contained in:
parent
df15b0d018
commit
9f6127af4d
@ -1539,14 +1539,18 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
|
||||
{
|
||||
const char *dir;
|
||||
size_t idx = do_read_32_relocated (ptr);
|
||||
if (idx >= debug_sections[DEBUG_STR].size)
|
||||
error (1, 0,
|
||||
"%s: Bad string pointer index %zd for comp_dir",
|
||||
dso->filename, idx);
|
||||
dir = (char *) debug_sections[DEBUG_STR].data + idx;
|
||||
/* In phase zero we collect the comp_dir. */
|
||||
if (phase == 0)
|
||||
{
|
||||
if (idx >= debug_sections[DEBUG_STR].size)
|
||||
error (1, 0,
|
||||
"%s: Bad string pointer index %zd for comp_dir",
|
||||
dso->filename, idx);
|
||||
dir = (char *) debug_sections[DEBUG_STR].data + idx;
|
||||
|
||||
free (comp_dir);
|
||||
comp_dir = strdup (dir);
|
||||
free (comp_dir);
|
||||
comp_dir = strdup (dir);
|
||||
}
|
||||
|
||||
if (dest_dir != NULL && phase == 0)
|
||||
{
|
||||
@ -1566,25 +1570,29 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
|
||||
unit. If starting with / it is a full path name.
|
||||
Note that we don't handle DW_FORM_string in this
|
||||
case. */
|
||||
char *name;
|
||||
size_t idx = do_read_32_relocated (ptr);
|
||||
if (idx >= debug_sections[DEBUG_STR].size)
|
||||
error (1, 0,
|
||||
"%s: Bad string pointer index %zd for unit name",
|
||||
dso->filename, idx);
|
||||
name = (char *) debug_sections[DEBUG_STR].data + idx;
|
||||
if (*name == '/' && comp_dir == NULL)
|
||||
{
|
||||
char *enddir = strrchr (name, '/');
|
||||
|
||||
if (enddir != name)
|
||||
/* In phase zero we will look for a comp_dir to use. */
|
||||
if (phase == 0)
|
||||
{
|
||||
if (idx >= debug_sections[DEBUG_STR].size)
|
||||
error (1, 0,
|
||||
"%s: Bad string pointer index %zd for unit name",
|
||||
dso->filename, idx);
|
||||
char *name = (char *) debug_sections[DEBUG_STR].data + idx;
|
||||
if (*name == '/' && comp_dir == NULL)
|
||||
{
|
||||
comp_dir = malloc (enddir - name + 1);
|
||||
memcpy (comp_dir, name, enddir - name);
|
||||
comp_dir [enddir - name] = '\0';
|
||||
char *enddir = strrchr (name, '/');
|
||||
|
||||
if (enddir != name)
|
||||
{
|
||||
comp_dir = malloc (enddir - name + 1);
|
||||
memcpy (comp_dir, name, enddir - name);
|
||||
comp_dir [enddir - name] = '\0';
|
||||
}
|
||||
else
|
||||
comp_dir = strdup ("/");
|
||||
}
|
||||
else
|
||||
comp_dir = strdup ("/");
|
||||
}
|
||||
|
||||
/* First pass (0) records the new name to be
|
||||
|
Loading…
x
Reference in New Issue
Block a user