{
if (symtab == NULL || symtab_index >= nsyms)
{
- error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
+ error (_(" bad symbol index: %08lx in reloc\n"),
+ (unsigned long) symtab_index);
res = FALSE;
}
else
printf (_("<string table index: %3ld>"), psym->st_name);
else if (psym->st_name >= strtablen)
{
- error (_("<corrupt string table index: %3ld>"), psym->st_name);
+ error (_("<corrupt string table index: %3ld>\n"),
+ psym->st_name);
res = FALSE;
}
else
case EF_Z80_MACH_EZ80_Z80: strcat (buf, ", EZ80"); break;
case EF_Z80_MACH_EZ80_ADL: strcat (buf, ", EZ80, ADL"); break;
case EF_Z80_MACH_GBZ80: strcat (buf, ", GBZ80"); break;
+ case EF_Z80_MACH_Z80N: strcat (buf, ", Z80N"); break;
default:
strcat (buf, _(", unknown")); break;
}
(unsigned long) fixup->needed);
lib_name = "???";
}
+
printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
(int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
printf
if (strtab == NULL)
strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
1, strtab_sz, _("dynamic string section"));
+ if (strtab == NULL)
+ strtab_sz = 0;
break;
case DT_IA_64_VMS_NEEDED_IDENT:
}
if (i == sizeof (buf))
{
- error (_("corrupt change to vsp"));
+ error (_("corrupt change to vsp\n"));
res = FALSE;
}
else
if ((bfd_size_type) section.sh_offset > filedata->file_size)
{
/* See PR 21379 for a reproducer. */
- error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
+ error (_("Invalid DT_SYMTAB entry: %lx\n"),
+ (long) section.sh_offset);
return FALSE;
}
case STV_HIDDEN: return "HIDDEN";
case STV_PROTECTED: return "PROTECTED";
default:
- error (_("Unrecognized visibility value: %u"), visibility);
+ error (_("Unrecognized visibility value: %u\n"), visibility);
return _("<unknown>");
}
}
case STO_ALPHA_NOPV: return "NOPV";
case STO_ALPHA_STD_GPLOAD: return "STD GPLOAD";
default:
- error (_("Unrecognized alpah specific other value: %u"), other);
+ error (_("Unrecognized alpha specific other value: %u\n"), other);
return _("<unknown>");
}
}
|| relsec->sh_link >= filedata->file_header.e_shnum)
continue;
+ symsec = filedata->section_headers + relsec->sh_link;
+ if (symsec->sh_type != SHT_SYMTAB
+ && symsec->sh_type != SHT_DYNSYM)
+ return FALSE;
+
is_rela = relsec->sh_type == SHT_RELA;
if (is_rela)
if (filedata->file_header.e_machine == EM_SH)
is_rela = FALSE;
- symsec = filedata->section_headers + relsec->sh_link;
- if (symsec->sh_type != SHT_SYMTAB
- && symsec->sh_type != SHT_DYNSYM)
- return FALSE;
symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
for (rp = relocs; rp < relocs + num_relocs; ++rp)
end = start + num_bytes;
some_strings_shown = FALSE;
+#ifdef HAVE_MBSTATE_T
+ mbstate_t state;
+ /* Initialise the multibyte conversion state. */
+ memset (& state, 0, sizeof (state));
+#endif
+
+ bfd_boolean continuing = FALSE;
+
while (data < end)
{
while (!ISPRINT (* data))
{
size_t maxlen = end - data;
+ if (continuing)
+ {
+ printf (" ");
+ continuing = FALSE;
+ }
+ else
+ {
#ifndef __MSVCRT__
- /* PR 11128: Use two separate invocations in order to work
- around bugs in the Solaris 8 implementation of printf. */
- printf (" [%6tx] ", data - start);
+ /* PR 11128: Use two separate invocations in order to work
+ around bugs in the Solaris 8 implementation of printf. */
+ printf (" [%6tx] ", data - start);
#else
- printf (" [%6Ix] ", (size_t) (data - start));
+ printf (" [%6Ix] ", (size_t) (data - start));
#endif
+ }
+
if (maxlen > 0)
{
- print_symbol ((int) maxlen, (const char *) data);
- putchar ('\n');
- data += strnlen ((const char *) data, maxlen);
+ char c;
+
+ while (maxlen)
+ {
+ c = *data++;
+
+ if (c == 0)
+ break;
+
+ /* PR 25543: Treat new-lines as string-ending characters. */
+ if (c == '\n')
+ {
+ printf ("\\n\n");
+ if (*data != 0)
+ continuing = TRUE;
+ break;
+ }
+
+ /* Do not print control characters directly as they can affect terminal
+ settings. Such characters usually appear in the names generated
+ by the assembler for local labels. */
+ if (ISCNTRL (c))
+ {
+ printf ("^%c", c + 0x40);
+ }
+ else if (ISPRINT (c))
+ {
+ putchar (c);
+ }
+ else
+ {
+ size_t n;
+#ifdef HAVE_MBSTATE_T
+ wchar_t w;
+#endif
+ /* Let printf do the hard work of displaying multibyte characters. */
+ printf ("%.1s", data - 1);
+#ifdef HAVE_MBSTATE_T
+ /* Try to find out how many bytes made up the character that was
+ just printed. Advance the symbol pointer past the bytes that
+ were displayed. */
+ n = mbrtowc (& w, (char *)(data - 1), MB_CUR_MAX, & state);
+#else
+ n = 1;
+#endif
+ if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
+ data += (n - 1);
+ }
+ }
+
+ if (c != '\n')
+ putchar ('\n');
}
else
{
? sizeof (Elf32_External_Chdr)
: sizeof (Elf64_External_Chdr)))
{
- warn (_("compressed section %s is too small to contain a compression header"),
+ warn (_("compressed section %s is too small to contain a compression header\n"),
section->name);
return FALSE;
}
return TRUE;
}
+#if HAVE_LIBDEBUGINFOD
+/* Return a hex string representation of the build-id. */
+unsigned char *
+get_build_id (void * data)
+{
+ Filedata * filedata = (Filedata *)data;
+ Elf_Internal_Shdr * shdr;
+ unsigned long i;
+
+ /* Iterate through notes to find note.gnu.build-id.
+ FIXME: Only the first note in any note section is examined. */
+ for (i = 0, shdr = filedata->section_headers;
+ i < filedata->file_header.e_shnum && shdr != NULL;
+ i++, shdr++)
+ {
+ if (shdr->sh_type != SHT_NOTE)
+ continue;
+
+ char * next;
+ char * end;
+ size_t data_remaining;
+ size_t min_notesz;
+ Elf_External_Note * enote;
+ Elf_Internal_Note inote;
+
+ bfd_vma offset = shdr->sh_offset;
+ bfd_vma align = shdr->sh_addralign;
+ bfd_vma length = shdr->sh_size;
+
+ enote = (Elf_External_Note *) get_section_contents (shdr, filedata);
+ if (enote == NULL)
+ continue;
+
+ if (align < 4)
+ align = 4;
+ else if (align != 4 && align != 8)
+ continue;
+
+ end = (char *) enote + length;
+ data_remaining = end - (char *) enote;
+
+ if (!is_ia64_vms (filedata))
+ {
+ min_notesz = offsetof (Elf_External_Note, name);
+ if (data_remaining < min_notesz)
+ {
+ warn (_("\
+malformed note encountered in section %s whilst scanning for build-id note\n"),
+ printable_section_name (filedata, shdr));
+ continue;
+ }
+ data_remaining -= min_notesz;
+
+ inote.type = BYTE_GET (enote->type);
+ inote.namesz = BYTE_GET (enote->namesz);
+ inote.namedata = enote->name;
+ inote.descsz = BYTE_GET (enote->descsz);
+ inote.descdata = ((char *) enote
+ + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
+ inote.descpos = offset + (inote.descdata - (char *) enote);
+ next = ((char *) enote
+ + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
+ }
+ else
+ {
+ Elf64_External_VMS_Note *vms_enote;
+
+ /* PR binutils/15191
+ Make sure that there is enough data to read. */
+ min_notesz = offsetof (Elf64_External_VMS_Note, name);
+ if (data_remaining < min_notesz)
+ {
+ warn (_("\
+malformed note encountered in section %s whilst scanning for build-id note\n"),
+ printable_section_name (filedata, shdr));
+ continue;
+ }
+ data_remaining -= min_notesz;
+
+ vms_enote = (Elf64_External_VMS_Note *) enote;
+ inote.type = BYTE_GET (vms_enote->type);
+ inote.namesz = BYTE_GET (vms_enote->namesz);
+ inote.namedata = vms_enote->name;
+ inote.descsz = BYTE_GET (vms_enote->descsz);
+ inote.descdata = inote.namedata + align_power (inote.namesz, 3);
+ inote.descpos = offset + (inote.descdata - (char *) enote);
+ next = inote.descdata + align_power (inote.descsz, 3);
+ }
+
+ /* Skip malformed notes. */
+ if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
+ || (size_t) (inote.descdata - inote.namedata) > data_remaining
+ || (size_t) (next - inote.descdata) < inote.descsz
+ || ((size_t) (next - inote.descdata)
+ > data_remaining - (size_t) (inote.descdata - inote.namedata)))
+ {
+ warn (_("\
+malformed note encountered in section %s whilst scanning for build-id note\n"),
+ printable_section_name (filedata, shdr));
+ continue;
+ }
+
+ /* Check if this is the build-id note. If so then convert the build-id
+ bytes to a hex string. */
+ if (inote.namesz > 0
+ && const_strneq (inote.namedata, "GNU")
+ && inote.type == NT_GNU_BUILD_ID)
+ {
+ unsigned long j;
+ char * build_id;
+
+ build_id = malloc (inote.descsz * 2 + 1);
+ if (build_id == NULL)
+ return NULL;
+
+ for (j = 0; j < inote.descsz; ++j)
+ sprintf (build_id + (j * 2), "%02x", inote.descdata[j] & 0xff);
+ build_id[inote.descsz * 2] = '\0';
+
+ return (unsigned char *) build_id;
+ }
+ }
+
+ return NULL;
+}
+#endif /* HAVE_LIBDEBUGINFOD */
+
/* If this is not NULL, load_debug_section will only look for sections
within the list of sections given here. */
static unsigned int * section_subset = NULL;
section->start = NULL;
section->address = 0;
section->size = 0;
+
+ if (section->reloc_info != NULL)
+ {
+ free (section->reloc_info);
+ section->reloc_info = NULL;
+ section->num_relocs = 0;
+ }
}
static bfd_boolean
printf ("%02x ", ptr[j] & 0xff);
printf (">");
-next:
+ next:
ptr += ((datasz + (size - 1)) & ~ (size - 1));
if (ptr == ptr_end)
break;
{
warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
(long) align);
+ free (pnotes);
return FALSE;
}
filedata->string_table = NULL;
filedata->string_table_length = 0;
+ if (filedata->dump_sects != NULL)
+ {
+ free (filedata->dump_sects);
+ filedata->dump_sects = NULL;
+ filedata->num_dump_sects = 0;
+ }
+
if (dynamic_strings)
{
free (dynamic_strings);
ret = FALSE;
}
- if (filedata->dump_sects != NULL)
- {
- free (filedata->dump_sects);
- filedata->dump_sects = NULL;
- filedata->num_dump_sects = 0;
- }
-
free (qualified_name);
}