aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfcode.h
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1994-10-17 18:27:40 +0000
committerIan Lance Taylor <ian@airs.com>1994-10-17 18:27:40 +0000
commit24f13b03316bafcc34781122bdc371c06e5224c7 (patch)
treeb0c224ccb45a561cbd60c3532d4a2517569775b4 /bfd/elfcode.h
parent5e643795a3cad22ba84a0b0a93b72061d6fc64c3 (diff)
downloadgdb-24f13b03316bafcc34781122bdc371c06e5224c7.zip
gdb-24f13b03316bafcc34781122bdc371c06e5224c7.tar.gz
gdb-24f13b03316bafcc34781122bdc371c06e5224c7.tar.bz2
* elfcode.h (elf_swap_shdr_in): Use rawdata, not bfd_section.
Clear contents field. (bfd_section_from_shdr): In SHT_STRTAB case, check bfd_section, not rawdata. Don't set rawdata if e_shstrndx. Use bfd_section rather than rawdata in commented out code. In SHT_REL[A] case, don't bother to check elf_section_data of section returned by section_from_elf_index. (elf_fake_sections): Set bfd_section, not rawdata. Don't set size. (elf_map_symbols): Don't set elf_num_section_syms. Don't create section symbols that already exist. (assign_file_position_for_section): Use bfd_section, not rawdata. (section_from_elf_index): Just check bfd_section field. (elf_section_from_bfd_section): Likewise. (elf_debug_section): Don't print rawdata, contents, or size. (elf_link_add_object_symbols): Don't error out if section_from_elf_index returns NULL. (elf_bfd_final_link): Check return value from section_from_elf_index against NULL, not bfd_is_abs_section. (elf_link_input_bfd): Don't check section_from_elf_index return value. * libelf.h (struct elf_obj_tdata): Remove num_section_syms field. (elf_num_section_syms): Don't define. * elf.c (elf_get_str_section): Store section contents in contents field rather than rawdata field. (elf_string_from_elf_section): Likewise. (_bfd_elf_make_section_from_shdr): Store BFD section pointer in bfd_section field rather than rawdata field. * elf32-hppa.c (elf32_hppa_read_symext_info): Use bfd_section rather than rawdata. (elf32_hppa_size_stubs): Likewise. * elf32-mips.c (mips_elf_final_write_processing): Use bfd_section rathern than rawdata. (mips_elf_section_from_shdr): Likewise. (mips_elf_section_processing): Likewise. (mips_elf_section_from_bfd_section): Remove rawdata check.
Diffstat (limited to 'bfd/elfcode.h')
-rw-r--r--bfd/elfcode.h193
1 files changed, 69 insertions, 124 deletions
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
index 888e512..60b3a49 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
@@ -300,8 +300,8 @@ elf_swap_shdr_in (abfd, src, dst)
dst->sh_info = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_info);
dst->sh_addralign = get_word (abfd, (bfd_byte *) src->sh_addralign);
dst->sh_entsize = get_word (abfd, (bfd_byte *) src->sh_entsize);
- /* we haven't done any processing on it yet, so... */
- dst->rawdata = (void *) 0;
+ dst->bfd_section = NULL;
+ dst->contents = NULL;
}
/* Translate an ELF section header table entry in internal format into an
@@ -575,13 +575,12 @@ bfd_section_from_shdr (abfd, shindex)
return _bfd_elf_make_section_from_shdr (abfd, hdr, name);
case SHT_STRTAB: /* A string table */
- if (hdr->rawdata != NULL)
+ if (hdr->bfd_section != NULL)
return true;
if (ehdr->e_shstrndx == shindex)
{
elf_tdata (abfd)->shstrtab_hdr = *hdr;
elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->shstrtab_hdr;
- hdr->rawdata = (PTR) & elf_tdata (abfd)->shstrtab_hdr;
return true;
}
{
@@ -613,10 +612,10 @@ bfd_section_from_shdr (abfd, shindex)
#if 0 /* Not handling other string tables specially right now. */
hdr2 = elf_elfsections (abfd)[i]; /* in case it moved */
/* We have a strtab for some random other section. */
- newsect = (asection *) hdr2->rawdata;
+ newsect = (asection *) hdr2->bfd_section;
if (!newsect)
break;
- hdr->rawdata = (PTR) newsect;
+ hdr->bfd_section = newsect;
hdr2 = &elf_section_data (newsect)->str_hdr;
*hdr2 = *hdr;
elf_elfsections (abfd)[shindex] = hdr2;
@@ -663,8 +662,7 @@ bfd_section_from_shdr (abfd, shindex)
if (! bfd_section_from_shdr (abfd, hdr->sh_info))
return false;
target_sect = section_from_elf_index (abfd, hdr->sh_info);
- if (target_sect == NULL
- || elf_section_data (target_sect) == NULL)
+ if (target_sect == NULL)
return false;
hdr2 = &elf_section_data (target_sect)->rel_hdr;
@@ -1188,9 +1186,8 @@ elf_fake_sections (abfd, asect, ignore)
this_hdr->sh_addralign = 1 << asect->alignment_power;
this_hdr->sh_entsize = 0;
- this_hdr->rawdata = (PTR) asect;
+ this_hdr->bfd_section = asect;
this_hdr->contents = NULL;
- this_hdr->size = 0;
/* FIXME: This should not be based on section names. */
if (strcmp (asect->name, ".dynstr") == 0)
@@ -1279,7 +1276,6 @@ elf_fake_sections (abfd, asect, ignore)
rela_hdr->sh_addr = 0;
rela_hdr->sh_size = 0;
rela_hdr->sh_offset = 0;
- rela_hdr->size = 0;
}
}
@@ -1520,7 +1516,6 @@ elf_map_symbols (abfd)
}
max_index++;
- elf_num_section_syms (abfd) = max_index;
sect_syms = (asymbol **) bfd_zalloc (abfd, max_index * sizeof (asymbol *));
elf_section_syms (abfd) = sect_syms;
@@ -1530,18 +1525,40 @@ elf_map_symbols (abfd)
return false;
}
- for (asect = abfd->sections; asect; asect = asect->next)
+ for (idx = 0; idx < symcount; idx++)
{
- asymbol *sym = bfd_make_empty_symbol (abfd);
- if (!sym)
+ if ((syms[idx]->flags & BSF_SECTION_SYM) != 0)
{
- bfd_set_error (bfd_error_no_memory);
- return false;
+ asection *sec;
+
+ sec = syms[idx]->section;
+ if (! bfd_is_abs_section (sec))
+ {
+ if (sec->owner != abfd)
+ {
+ sec = sec->output_section;
+ BFD_ASSERT (sec->owner == abfd);
+ }
+ sect_syms[sec->index] = syms[idx];
+ }
}
+ }
+
+ for (asect = abfd->sections; asect; asect = asect->next)
+ {
+ asymbol *sym;
+
+ if (sect_syms[asect->index] != NULL)
+ continue;
+
+ sym = bfd_make_empty_symbol (abfd);
+ if (sym == NULL)
+ return false;
sym->the_bfd = abfd;
sym->name = asect->name;
sym->value = asect->vma;
- sym->flags = BSF_SECTION_SYM;
+ /* Set the flags to 0 to indicate that this one was newly added. */
+ sym->flags = 0;
sym->section = asect;
sect_syms[asect->index] = sym;
num_sections++;
@@ -1554,15 +1571,15 @@ elf_map_symbols (abfd)
if (num_sections)
{
-#if 0 /* @@ I just deleted bfd_realloc, because it's broken and too hard to
- fix. I'm leaving this code here as a reminder to look at this more
- carefully later and see if we can avoid wasting memory. */
if (syms)
- syms = (asymbol **) bfd_realloc (abfd, syms,
+ {
+ asymbol **osyms = syms;
+ syms = (asymbol **) bfd_alloc (abfd,
((symcount + num_sections + 1)
* sizeof (asymbol *)));
+ memcpy (syms, osyms, symcount * sizeof (asymbol *));
+ }
else
-#endif
syms = (asymbol **) bfd_alloc (abfd,
(num_sections + 1) * sizeof (asymbol *));
if (!syms)
@@ -1573,8 +1590,12 @@ elf_map_symbols (abfd)
for (asect = abfd->sections; asect; asect = asect->next)
{
- if (sect_syms[asect->index])
- syms[symcount++] = sect_syms[asect->index];
+ if (sect_syms[asect->index] != NULL
+ && sect_syms[asect->index]->flags == 0)
+ {
+ sect_syms[asect->index]->flags = BSF_SECTION_SYM;
+ syms[symcount++] = sect_syms[asect->index];
+ }
}
syms[symcount] = (asymbol *) 0;
@@ -1699,8 +1720,8 @@ assign_file_position_for_section (i_shdrp, offset, align)
offset = BFD_ALIGN (offset, al);
}
i_shdrp->sh_offset = offset;
- if (i_shdrp->rawdata != NULL)
- ((asection *) i_shdrp->rawdata)->filepos = offset;
+ if (i_shdrp->bfd_section != NULL)
+ i_shdrp->bfd_section->filepos = offset;
if (i_shdrp->sh_type != SHT_NOBITS)
offset += i_shdrp->sh_size;
return offset;
@@ -2395,7 +2416,6 @@ swap_out_syms (abfd)
symstrtab_hdr->sh_link = 0;
symstrtab_hdr->sh_info = 0;
symstrtab_hdr->sh_addralign = 1;
- symstrtab_hdr->size = 0;
}
return true;
@@ -2524,52 +2544,18 @@ NAME(bfd_elf,write_object_contents) (abfd)
return write_shdrs_and_ehdr (abfd);
}
-/* Given an index of a section, retrieve a pointer to it. Note
- that for our purposes, sections are indexed by {1, 2, ...} with
- 0 being an illegal index. */
-
-/* In the original, each ELF section went into exactly one BFD
- section. This doesn't really make sense, so we need a real mapping.
- The mapping has to hide in the Elf_Internal_Shdr since asection
- doesn't have anything like a tdata field... */
+/* Given an ELF section number, retrieve the corresponding BFD
+ section. */
static asection *
section_from_elf_index (abfd, index)
bfd *abfd;
unsigned int index;
{
- /* @@ Is bfd_com_section_ptr really correct in all the places it could
- be returned from this routine? */
-
- if (index == SHN_ABS)
- return bfd_com_section_ptr; /* not abs? */
- if (index == SHN_COMMON)
- return bfd_com_section_ptr;
-
+ BFD_ASSERT (index > 0 && index < SHN_LORESERVE);
if (index >= elf_elfheader (abfd)->e_shnum)
return NULL;
-
- {
- Elf_Internal_Shdr *hdr = elf_elfsections (abfd)[index];
-
- switch (hdr->sh_type)
- {
- /* ELF sections that map to BFD sections */
- case SHT_PROGBITS:
- case SHT_NOBITS:
- case SHT_HASH:
- case SHT_DYNAMIC:
- if (hdr->rawdata == NULL)
- {
- if (! bfd_section_from_shdr (abfd, index))
- return NULL;
- }
- return (struct sec *) hdr->rawdata;
-
- default:
- return bfd_abs_section_ptr;
- }
- }
+ return elf_elfsections (abfd)[index]->bfd_section;
}
/* given a section, search the header to find them... */
@@ -2578,6 +2564,7 @@ elf_section_from_bfd_section (abfd, asect)
bfd *abfd;
struct sec *asect;
{
+ struct elf_backend_data *bed = get_elf_backend_data (abfd);
Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
int index;
Elf_Internal_Shdr *hdr;
@@ -2599,56 +2586,20 @@ elf_section_from_bfd_section (abfd, asect)
for (index = 0; index < maxindex; index++)
{
hdr = i_shdrp[index];
- switch (hdr->sh_type)
- {
- /* ELF sections that map to BFD sections */
- case SHT_PROGBITS:
- case SHT_NOBITS:
- case SHT_NOTE:
- case SHT_HASH:
- case SHT_DYNAMIC:
- case SHT_DYNSYM:
- case SHT_SYMTAB:
- if (hdr->rawdata)
- {
- if (((struct sec *) (hdr->rawdata)) == asect)
- return index;
- }
- break;
-
- case SHT_REL:
- case SHT_RELA:
- /* We sometimes map a reloc section to a BFD section. */
- if (hdr->sh_link != elf_onesymtab (abfd)
- && (asection *) hdr->rawdata == asect)
- return index;
- break;
+ if (hdr->bfd_section == asect)
+ return index;
- case SHT_STRTAB:
- /* We map most string tables to BFD sections. */
- if (index != elf_elfheader (abfd)->e_shstrndx
- && index != elf_onesymtab (abfd)
- && (asection *) hdr->rawdata == asect)
- return index;
-
- /* FALL THROUGH */
- default:
- {
- struct elf_backend_data *bed = get_elf_backend_data (abfd);
-
- if (bed->elf_backend_section_from_bfd_section)
- {
- int retval;
+ if (bed->elf_backend_section_from_bfd_section)
+ {
+ int retval;
- retval = index;
- if ((*bed->elf_backend_section_from_bfd_section)
- (abfd, hdr, asect, &retval))
- return retval;
- }
- }
- break;
+ retval = index;
+ if ((*bed->elf_backend_section_from_bfd_section)
+ (abfd, hdr, asect, &retval))
+ return retval;
}
}
+
return -1;
}
@@ -3073,9 +3024,6 @@ elf_debug_section (str, num, hdr)
(long) hdr->sh_addralign);
fprintf (stderr, "sh_entsize = %ld\n",
(long) hdr->sh_entsize);
- fprintf (stderr, "rawdata = 0x%.8lx\n", (long) hdr->rawdata);
- fprintf (stderr, "contents = 0x%.8lx\n", (long) hdr->contents);
- fprintf (stderr, "size = %ld\n", (long) hdr->size);
fflush (stderr);
}
@@ -4203,9 +4151,10 @@ elf_link_add_object_symbols (abfd, info)
else if (sym.st_shndx > 0 && sym.st_shndx < SHN_LORESERVE)
{
sec = section_from_elf_index (abfd, sym.st_shndx);
- if (sec == NULL)
- goto error_return;
- value -= sec->vma;
+ if (sec != NULL)
+ value -= sec->vma;
+ else
+ sec = bfd_abs_section_ptr;
}
else if (sym.st_shndx == SHN_ABS)
sec = bfd_abs_section_ptr;
@@ -5389,7 +5338,7 @@ elf_bfd_final_link (abfd, info)
for (i = 1; i < elf_elfheader (abfd)->e_shnum; i++)
{
o = section_from_elf_index (abfd, i);
- if (! bfd_is_abs_section (o))
+ if (o != NULL)
o->target_index = abfd->symcount;
elfsym.st_shndx = i;
if (! elf_link_output_sym (&finfo, (const char *) NULL,
@@ -6034,11 +5983,7 @@ elf_link_input_bfd (finfo, input_bfd)
if (isym->st_shndx == SHN_UNDEF)
isec = bfd_und_section_ptr;
else if (isym->st_shndx > 0 && isym->st_shndx < SHN_LORESERVE)
- {
- isec = section_from_elf_index (input_bfd, isym->st_shndx);
- if (isec == NULL)
- return false;
- }
+ isec = section_from_elf_index (input_bfd, isym->st_shndx);
else if (isym->st_shndx == SHN_ABS)
isec = bfd_abs_section_ptr;
else if (isym->st_shndx == SHN_COMMON)