diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2003-04-12 00:31:42 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@redhat.com> | 2003-04-12 00:31:42 +0000 |
commit | 28df4a739c9a64fc8437d9c4c5417c52c0587d63 (patch) | |
tree | f6bd4527c29b471572d59c7e37cb3e2f3bde16a8 | |
parent | 7f66f543d2026573c0c07ebda5c9669116cb331e (diff) | |
download | gdb-28df4a739c9a64fc8437d9c4c5417c52c0587d63.tar.gz |
* elfxx-mips.c (mips_elf_get_global_gotsym_index): New.
(mips_elf_calculate_relocation): Decay GOT_PAGE/GOT_OFST to
GOT_DISP/addend only if the symbol got a global GOT entry.
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 33 |
2 files changed, 36 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4228d7c44e7..3b7c715fe9e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2003-04-11 Alexandre Oliva <aoliva@redhat.com> + + * elfxx-mips.c (mips_elf_get_global_gotsym_index): New. + (mips_elf_calculate_relocation): Decay GOT_PAGE/GOT_OFST to + GOT_DISP/addend only if the symbol got a global GOT entry. + 2003-04-10 Alexandre Oliva <aoliva@redhat.com> * elfxx-mips.c (mips_elf_calculate_relocation): Decay diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index d2ba1cf8c23..73d052033ad 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -408,6 +408,7 @@ static asection * mips_elf_rel_dyn_section PARAMS ((bfd *, bfd_boolean)); static asection * mips_elf_got_section PARAMS ((bfd *, bfd_boolean)); static struct mips_got_info *mips_elf_got_info PARAMS ((bfd *, asection **)); +static long mips_elf_get_global_gotsym_index PARAMS ((bfd *abfd)); static bfd_vma mips_elf_local_got_index PARAMS ((bfd *, bfd *, struct bfd_link_info *, bfd_vma)); static bfd_vma mips_elf_global_got_index @@ -1707,6 +1708,29 @@ mips_elf_got_info (abfd, sgotp) return g; } +/* Obtain the lowest dynamic index of a symbol that was assigned a + global GOT entry. */ +static long +mips_elf_get_global_gotsym_index (abfd) + bfd *abfd; +{ + asection *sgot; + struct mips_got_info *g; + + if (abfd == NULL) + return 0; + + sgot = mips_elf_got_section (abfd, TRUE); + if (sgot == NULL || mips_elf_section_data (sgot) == NULL) + return 0; + + g = mips_elf_section_data (sgot)->u.got_info; + if (g == NULL || g->global_gotsym == NULL) + return 0; + + return g->global_gotsym->dynindx; +} + /* Returns the GOT offset at which the indicated address can be found. If there is not yet a GOT entry for this value, create one. Returns -1 if no satisfactory GOT offset can be found. */ @@ -3197,9 +3221,12 @@ mips_elf_calculate_relocation (abfd, input_bfd, input_section, info, switch (r_type) { case R_MIPS_GOT_PAGE: - /* If we didn't create a dynamic index for this symbol, it can - be regarded as local. */ - if (local_p || ! h || h->root.dynindx < 0) + /* If this symbol got a global GOT entry, we have to decay + GOT_PAGE/GOT_OFST to GOT_DISP/addend. */ + if (local_p || ! h + || (h->root.dynindx + < mips_elf_get_global_gotsym_index (elf_hash_table (info) + ->dynobj))) break; /* Fall through. */ |