* elf32-i386.c (elf_backend_plt_readonly): Set correctly, to 1.

* elf32-sparc.c (elf_backend_plt_readonly): Set correctly, to 0.
PR 8513.
This commit is contained in:
Ian Lance Taylor 1995-11-27 17:42:27 +00:00
parent d38644cd59
commit 3b3f762596
3 changed files with 69 additions and 34 deletions

View File

@ -1,3 +1,8 @@
Mon Nov 27 12:27:46 1995 Ian Lance Taylor <ian@cygnus.com>
* elf32-i386.c (elf_backend_plt_readonly): Set correctly, to 1.
* elf32-sparc.c (elf_backend_plt_readonly): Set correctly, to 0.
Wed Nov 22 12:02:09 1995 Ian Lance Taylor <ian@cygnus.com> Wed Nov 22 12:02:09 1995 Ian Lance Taylor <ian@cygnus.com>
* ecoff.c (_bfd_ecoff_new_section_hook): Handle .rconst section. * ecoff.c (_bfd_ecoff_new_section_hook): Handle .rconst section.

View File

@ -21,7 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "sysdep.h" #include "sysdep.h"
#include "bfdlink.h" #include "bfdlink.h"
#include "libbfd.h" #include "libbfd.h"
#include "libelf.h" #include "elf-bfd.h"
static reloc_howto_type *elf_i386_reloc_type_lookup static reloc_howto_type *elf_i386_reloc_type_lookup
PARAMS ((bfd *, bfd_reloc_code_real_type)); PARAMS ((bfd *, bfd_reloc_code_real_type));
@ -275,7 +275,7 @@ elf_i386_check_relocs (abfd, info, sec, relocs)
rel_end = relocs + sec->reloc_count; rel_end = relocs + sec->reloc_count;
for (rel = relocs; rel < rel_end; rel++) for (rel = relocs; rel < rel_end; rel++)
{ {
long r_symndx; unsigned long r_symndx;
struct elf_link_hash_entry *h; struct elf_link_hash_entry *h;
r_symndx = ELF32_R_SYM (rel->r_info); r_symndx = ELF32_R_SYM (rel->r_info);
@ -358,7 +358,7 @@ elf_i386_check_relocs (abfd, info, sec, relocs)
if (local_got_offsets == NULL) if (local_got_offsets == NULL)
{ {
size_t size; size_t size;
register int i; register unsigned int i;
size = symtab_hdr->sh_info * sizeof (bfd_vma); size = symtab_hdr->sh_info * sizeof (bfd_vma);
local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size); local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
@ -418,7 +418,7 @@ elf_i386_check_relocs (abfd, info, sec, relocs)
case R_386_PC32: case R_386_PC32:
if (info->shared if (info->shared
&& (sec->flags & SEC_ALLOC) != 0 && (sec->flags & SEC_ALLOC) != 0
&& (r_type != R_386_PC32 || h != NULL)) && (ELF32_R_TYPE (rel->r_info) != R_386_PC32 || h != NULL))
{ {
/* When creating a shared object, we must copy these /* When creating a shared object, we must copy these
reloc types into the output file. We create a reloc reloc types into the output file. We create a reloc
@ -848,7 +848,7 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
{ {
int r_type; int r_type;
reloc_howto_type *howto; reloc_howto_type *howto;
long r_symndx; unsigned long r_symndx;
struct elf_link_hash_entry *h; struct elf_link_hash_entry *h;
Elf_Internal_Sym *sym; Elf_Internal_Sym *sym;
asection *sec; asection *sec;
@ -1143,7 +1143,7 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
else else
{ {
BFD_ASSERT (h->dynindx != (bfd_vma) -1); BFD_ASSERT (h->dynindx != -1);
outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_32); outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_32);
} }
} }
@ -1519,7 +1519,7 @@ elf_i386_finish_dynamic_sections (output_bfd, info)
#define elf_backend_finish_dynamic_sections \ #define elf_backend_finish_dynamic_sections \
elf_i386_finish_dynamic_sections elf_i386_finish_dynamic_sections
#define elf_backend_want_got_plt 1 #define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 0 #define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0 #define elf_backend_want_plt_sym 0
#include "elf32-target.h" #include "elf32-target.h"

View File

@ -21,7 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "sysdep.h" #include "sysdep.h"
#include "bfdlink.h" #include "bfdlink.h"
#include "libbfd.h" #include "libbfd.h"
#include "libelf.h" #include "elf-bfd.h"
static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
PARAMS ((bfd *, bfd_reloc_code_real_type)); PARAMS ((bfd *, bfd_reloc_code_real_type));
@ -148,7 +148,7 @@ bfd_elf32_bfd_reloc_type_lookup (abfd, code)
bfd *abfd; bfd *abfd;
bfd_reloc_code_real_type code; bfd_reloc_code_real_type code;
{ {
int i; unsigned int i;
for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map); i++) for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map); i++)
{ {
if (sparc_reloc_map[i].bfd_reloc_val == code) if (sparc_reloc_map[i].bfd_reloc_val == code)
@ -231,7 +231,7 @@ elf32_sparc_check_relocs (abfd, info, sec, relocs)
rel_end = relocs + sec->reloc_count; rel_end = relocs + sec->reloc_count;
for (rel = relocs; rel < rel_end; rel++) for (rel = relocs; rel < rel_end; rel++)
{ {
long r_symndx; unsigned long r_symndx;
struct elf_link_hash_entry *h; struct elf_link_hash_entry *h;
r_symndx = ELF32_R_SYM (rel->r_info); r_symndx = ELF32_R_SYM (rel->r_info);
@ -305,7 +305,7 @@ elf32_sparc_check_relocs (abfd, info, sec, relocs)
if (local_got_offsets == NULL) if (local_got_offsets == NULL)
{ {
size_t size; size_t size;
register int i; register unsigned int i;
size = symtab_hdr->sh_info * sizeof (bfd_vma); size = symtab_hdr->sh_info * sizeof (bfd_vma);
local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size); local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size);
@ -370,14 +370,17 @@ elf32_sparc_check_relocs (abfd, info, sec, relocs)
&& strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
break; break;
/* Fall through. */ /* Fall through. */
case R_SPARC_8:
case R_SPARC_16:
case R_SPARC_32:
case R_SPARC_DISP8: case R_SPARC_DISP8:
case R_SPARC_DISP16: case R_SPARC_DISP16:
case R_SPARC_DISP32: case R_SPARC_DISP32:
case R_SPARC_WDISP30: case R_SPARC_WDISP30:
case R_SPARC_WDISP22: case R_SPARC_WDISP22:
if (h == NULL)
break;
/* Fall through. */
case R_SPARC_8:
case R_SPARC_16:
case R_SPARC_32:
case R_SPARC_HI22: case R_SPARC_HI22:
case R_SPARC_22: case R_SPARC_22:
case R_SPARC_13: case R_SPARC_13:
@ -453,6 +456,7 @@ elf32_sparc_adjust_dynamic_symbol (info, h)
/* Make sure we know what is going on here. */ /* Make sure we know what is going on here. */
BFD_ASSERT (dynobj != NULL BFD_ASSERT (dynobj != NULL
&& ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
|| h->weakdef != NULL
|| ((h->elf_link_hash_flags || ((h->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC) != 0 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
&& (h->elf_link_hash_flags && (h->elf_link_hash_flags
@ -838,7 +842,7 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
{ {
int r_type; int r_type;
reloc_howto_type *howto; reloc_howto_type *howto;
long r_symndx; unsigned long r_symndx;
struct elf_link_hash_entry *h; struct elf_link_hash_entry *h;
Elf_Internal_Sym *sym; Elf_Internal_Sym *sym;
asection *sec; asection *sec;
@ -898,7 +902,11 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
|| ((r_type == R_SPARC_GOT10 || ((r_type == R_SPARC_GOT10
|| r_type == R_SPARC_GOT13 || r_type == R_SPARC_GOT13
|| r_type == R_SPARC_GOT22) || r_type == R_SPARC_GOT22)
&& elf_hash_table (info)->dynamic_sections_created) && elf_hash_table (info)->dynamic_sections_created
&& (! info->shared
|| ! info->symbolic
|| (h->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR) == 0))
|| (info->shared || (info->shared
&& (input_section->flags & SEC_ALLOC) != 0 && (input_section->flags & SEC_ALLOC) != 0
&& (r_type == R_SPARC_8 && (r_type == R_SPARC_8
@ -931,7 +939,7 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
} }
else if (h->root.type == bfd_link_hash_undefweak) else if (h->root.type == bfd_link_hash_undefweak)
relocation = 0; relocation = 0;
else if (info->shared) else if (info->shared && !info->symbolic)
relocation = 0; relocation = 0;
else else
{ {
@ -963,13 +971,18 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
off = h->got_offset; off = h->got_offset;
BFD_ASSERT (off != (bfd_vma) -1); BFD_ASSERT (off != (bfd_vma) -1);
if (! elf_hash_table (info)->dynamic_sections_created) if (! elf_hash_table (info)->dynamic_sections_created
|| (info->shared
&& info->symbolic
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
{ {
/* This is actually a static link. We must /* This is actually a static link, or it is a
initialize this entry in the global offset table. -Bsymbolic link and the symbol is defined
Since the offset must always be a multiple of 4, locally. We must initialize this entry in the
we use the least significant bit to record global offset table. Since the offset must
whether we have initialized it already. always be a multiple of 4, we use the least
significant bit to record whether we have
initialized it already.
When doing a dynamic link, we create a .rela.got When doing a dynamic link, we create a .rela.got
relocation entry to initialize the value. This relocation entry to initialize the value. This
@ -1042,7 +1055,8 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
if (h->plt_offset == (bfd_vma) -1) if (h->plt_offset == (bfd_vma) -1)
{ {
/* We didn't make a PLT entry for this symbol. This /* We didn't make a PLT entry for this symbol. This
happens when statically linking PIC code. */ happens when statically linking PIC code, or when
using -Bsymbolic. */
break; break;
} }
@ -1063,14 +1077,17 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
&& strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
break; break;
/* Fall through. */ /* Fall through. */
case R_SPARC_8:
case R_SPARC_16:
case R_SPARC_32:
case R_SPARC_DISP8: case R_SPARC_DISP8:
case R_SPARC_DISP16: case R_SPARC_DISP16:
case R_SPARC_DISP32: case R_SPARC_DISP32:
case R_SPARC_WDISP30: case R_SPARC_WDISP30:
case R_SPARC_WDISP22: case R_SPARC_WDISP22:
if (h == NULL)
break;
/* Fall through. */
case R_SPARC_8:
case R_SPARC_16:
case R_SPARC_32:
case R_SPARC_HI22: case R_SPARC_HI22:
case R_SPARC_22: case R_SPARC_22:
case R_SPARC_13: case R_SPARC_13:
@ -1280,12 +1297,24 @@ elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
srela = bfd_get_section_by_name (dynobj, ".rela.got"); srela = bfd_get_section_by_name (dynobj, ".rela.got");
BFD_ASSERT (sgot != NULL && srela != NULL); BFD_ASSERT (sgot != NULL && srela != NULL);
bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got_offset);
rela.r_offset = (sgot->output_section->vma rela.r_offset = (sgot->output_section->vma
+ sgot->output_offset + sgot->output_offset
+ h->got_offset); + (h->got_offset &~ 1));
rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_GLOB_DAT);
/* If this is a -Bsymbolic link, and the symbol is defined
locally, we just want to emit a RELATIVE reloc. The entry in
the global offset table will already have been initialized in
the relocate_section function. */
if (info->shared
&& info->symbolic
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
rela.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
else
{
bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got_offset);
rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_GLOB_DAT);
}
rela.r_addend = 0; rela.r_addend = 0;
bfd_elf32_swap_reloca_out (output_bfd, &rela, bfd_elf32_swap_reloca_out (output_bfd, &rela,
((Elf32_External_Rela *) srela->contents ((Elf32_External_Rela *) srela->contents
@ -1446,8 +1475,9 @@ elf32_sparc_finish_dynamic_sections (output_bfd, info)
sym.st_shndx = indx; sym.st_shndx = indx;
bfd_elf32_swap_symbol_out (output_bfd, &sym, bfd_elf32_swap_symbol_out (output_bfd, &sym,
(char*) ((Elf32_External_Sym *) sdynsym->contents (PTR) (((Elf32_External_Sym *)
+ elf_section_data (s)->dynindx)); sdynsym->contents)
+ elf_section_data (s)->dynindx));
} }
/* Set the sh_info field of the output .dynsym section to the /* Set the sh_info field of the output .dynsym section to the
@ -1477,7 +1507,7 @@ elf32_sparc_finish_dynamic_sections (output_bfd, info)
#define elf_backend_finish_dynamic_sections \ #define elf_backend_finish_dynamic_sections \
elf32_sparc_finish_dynamic_sections elf32_sparc_finish_dynamic_sections
#define elf_backend_want_got_plt 0 #define elf_backend_want_got_plt 0
#define elf_backend_plt_readonly 1 #define elf_backend_plt_readonly 0
#define elf_backend_want_plt_sym 1 #define elf_backend_want_plt_sym 1
#include "elf32-target.h" #include "elf32-target.h"