mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-17 13:10:12 +08:00
Better handking for unresolved symbols
This commit is contained in:
parent
04d1ab347d
commit
560e09e9cc
@ -1,3 +1,45 @@
|
||||
2003-08-20 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* elf-bfd.h (RELOC_FOR_GLOBAL_SYMBOL): New macro used to
|
||||
replace some duplicated code in most elfxx-xxxx.c files. This
|
||||
version uses the new fields in bfd_link_info.
|
||||
|
||||
* elf-m10300.c (mn10300_elf_relocate_section): Use new macro.
|
||||
* elf32-arm.h (elf32_arm_relocate_section): Likewise.
|
||||
* elf32-cris.c (cris_elf_relocate_section): Likewise.
|
||||
* elf32-hppa.c (elf32_hppa_relocate_section): Likewise.
|
||||
* elf32-i386.c (elf_i386_relocate_section): Likewise.
|
||||
* elf32-ip2k.c (ip2k_elf_relocate_section): Likewise.
|
||||
* elf32-iq2000.c (iq2000_elf_relocate_section): Likewise.
|
||||
* elf32-m68k.c (elf_m68k_relocate_section): Likewise.
|
||||
* elf32-ppc.c (ppc_elf_relocate_section): Likewise.
|
||||
* elf32-s390.c (elf_s390_relocate_section): Likewise.
|
||||
* elf32-sparc.c (elf32_sparc_relocate_section): Likewise.
|
||||
* elf32-vax.c (elf_vax_relocate_section): Likewise.
|
||||
* elf32-xtensa.c (elf_xtensa_relocate_section): Likewise.
|
||||
* elf64-alpha.c (elf64_alpha_relocate_section): Likewise.
|
||||
* elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
|
||||
* elf64-s390.c (elf_s390_relocate_section): Likewise.
|
||||
* elf64-sparc.c (sparc64_elf_relocate_section): Likewise.
|
||||
* elf64-x86-64.c (elf64_x86_64_relocate_section): Likewise.
|
||||
* elfxx-ia64.c (elfNN_ia64_relocate_section): Likewise.
|
||||
|
||||
* elf-hppa.h (elf_hppa_unmark_useless_dynamic_symbols,
|
||||
elf_hppa_remark_useless_dynamic_symbols,
|
||||
elf_hppa_relocate_section): Use the new fields in
|
||||
bfd_link_info structure.
|
||||
* elf32-sh.c (sh_elf_relocate_section): Likewise.
|
||||
* elf64-alpha.c (elf64_alpha_check_relocs): Likewise.
|
||||
* elf64-hppa.c (elf64_hppa_check_relocs): Likewise.
|
||||
* elf64-sh64.c (sh_elf64_relocate_section): Likewise.
|
||||
* elfxx-ia64.c (elfNN_ia64_check_relocs): Likewise.
|
||||
* elfxx-mips.c (mips_elf_calculate_relocation): Likewise.
|
||||
|
||||
* elflink.h (elf_link_output_extsym): Fix test for reporting
|
||||
undefined symbols in shared libraries. Remove redundant test
|
||||
of shlib_undefined when reporting references to forced local
|
||||
symbols.
|
||||
|
||||
2003-08-18 Andreas Schwab <schwab@suse.de>
|
||||
|
||||
* libpei.h (bfd_pe_executable_p): Also recognize efi-app
|
||||
|
@ -1682,4 +1682,60 @@ extern bfd *_bfd_elf64_bfd_from_remote_memory
|
||||
extern bfd_boolean _sh_elf_set_mach_from_flags
|
||||
(bfd *);
|
||||
|
||||
/* This macro is to avoid lots of duplicated code in the body
|
||||
of xxx_relocate_section() in the various elfxx-xxxx.c files. */
|
||||
#define RELOC_FOR_GLOBAL_SYMBOL(h, sym_hashes, r_symndx, symtab_hdr, relocation, sec, unresolved_reloc, info, warned) \
|
||||
do \
|
||||
{ \
|
||||
/* It seems this can happen with erroneous or unsupported \
|
||||
input (mixing a.out and elf in an archive, for example.) */ \
|
||||
if (sym_hashes == NULL) \
|
||||
return FALSE; \
|
||||
\
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info]; \
|
||||
\
|
||||
while (h->root.type == bfd_link_hash_indirect \
|
||||
|| h->root.type == bfd_link_hash_warning) \
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link; \
|
||||
\
|
||||
warned = FALSE; \
|
||||
unresolved_reloc = FALSE; \
|
||||
relocation = 0; \
|
||||
if (h->root.type == bfd_link_hash_defined \
|
||||
|| h->root.type == bfd_link_hash_defweak) \
|
||||
{ \
|
||||
sec = h->root.u.def.section; \
|
||||
if (sec == NULL \
|
||||
|| sec->output_section == NULL) \
|
||||
/* Set a flag that will be cleared later if we find a \
|
||||
relocation value for this symbol. output_section \
|
||||
is typically NULL for symbols satisfied by a shared \
|
||||
library. */ \
|
||||
unresolved_reloc = TRUE; \
|
||||
else \
|
||||
relocation = (h->root.u.def.value \
|
||||
+ sec->output_section->vma \
|
||||
+ sec->output_offset); \
|
||||
} \
|
||||
else if (h->root.type == bfd_link_hash_undefweak) \
|
||||
; \
|
||||
else if (!info->executable \
|
||||
&& info->unresolved_syms_in_objects == RM_IGNORE \
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) \
|
||||
; \
|
||||
else \
|
||||
{ \
|
||||
if (! info->callbacks->undefined_symbol \
|
||||
(info, h->root.root.string, input_bfd, \
|
||||
input_section, rel->r_offset, \
|
||||
((info->shared && info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR) \
|
||||
|| (!info->shared && info->unresolved_syms_in_objects == RM_GENERATE_ERROR) \
|
||||
|| ELF_ST_VISIBILITY (h->other)) \
|
||||
)) \
|
||||
return FALSE; \
|
||||
warned = TRUE; \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#endif /* _LIBELF_H_ */
|
||||
|
@ -1097,7 +1097,7 @@ elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
|
||||
linker code. */
|
||||
if (! info->relocatable
|
||||
&& ! (info->shared
|
||||
&& !info->no_undefined)
|
||||
&& info->unresolved_syms_in_shared_libs == RM_IGNORE)
|
||||
&& h->root.type == bfd_link_hash_undefined
|
||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
|
||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
|
||||
@ -1132,7 +1132,7 @@ elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
|
||||
linker code. */
|
||||
if (! info->relocatable
|
||||
&& ! (info->shared
|
||||
&& !info->no_undefined)
|
||||
&& info->unresolved_syms_in_shared_libs == RM_IGNORE)
|
||||
&& h->root.type == bfd_link_hash_undefined
|
||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
|
||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
|
||||
@ -1399,7 +1399,8 @@ elf_hppa_relocate_section (bfd *output_bfd,
|
||||
relocation = 0;
|
||||
}
|
||||
/* Allow undefined symbols in shared libraries. */
|
||||
else if (info->shared && !info->no_undefined
|
||||
else if (info->shared
|
||||
&& info->unresolved_syms_in_shared_libs == RM_IGNORE
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
{
|
||||
if (info->symbolic)
|
||||
|
@ -1158,9 +1158,8 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
||||
}
|
||||
|
||||
bfd_elf32_swap_reloca_out (output_bfd, &outrel,
|
||||
(((Elf32_External_Rela *)
|
||||
sreloc->contents)
|
||||
+ sreloc->reloc_count));
|
||||
(bfd_byte *) (((Elf32_External_Rela *) sreloc->contents)
|
||||
+ sreloc->reloc_count));
|
||||
++sreloc->reloc_count;
|
||||
|
||||
/* If this reloc is against an external symbol, we do
|
||||
@ -1295,9 +1294,9 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
||||
}
|
||||
|
||||
bfd_elf32_swap_reloca_out (output_bfd, &outrel,
|
||||
(((Elf32_External_Rela *)
|
||||
sreloc->contents)
|
||||
+ sreloc->reloc_count));
|
||||
(bfd_byte *) (((Elf32_External_Rela *)
|
||||
sreloc->contents)
|
||||
+ sreloc->reloc_count));
|
||||
++sreloc->reloc_count;
|
||||
|
||||
return bfd_reloc_ok;
|
||||
@ -1480,9 +1479,9 @@ mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
||||
outrel.r_info = ELF32_R_INFO (0, R_MN10300_RELATIVE);
|
||||
outrel.r_addend = value;
|
||||
bfd_elf32_swap_reloca_out (output_bfd, &outrel,
|
||||
(((Elf32_External_Rela *)
|
||||
srelgot->contents)
|
||||
+ srelgot->reloc_count));
|
||||
(bfd_byte *) (((Elf32_External_Rela *)
|
||||
srelgot->contents)
|
||||
+ srelgot->reloc_count));
|
||||
++ srelgot->reloc_count;
|
||||
}
|
||||
|
||||
@ -1579,15 +1578,20 @@ mn10300_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.root.type == bfd_link_hash_indirect
|
||||
|| h->root.root.type == bfd_link_hash_warning)
|
||||
h = (struct elf32_mn10300_link_hash_entry *) h->root.root.u.i.link;
|
||||
if (h->root.root.type == bfd_link_hash_defined
|
||||
bfd_boolean unresolved_reloc;
|
||||
bfd_boolean warned;
|
||||
struct elf_link_hash_entry *hh;
|
||||
|
||||
RELOC_FOR_GLOBAL_SYMBOL (hh, (struct elf_link_hash_entry *) sym_hashes,
|
||||
r_symndx, symtab_hdr, relocation,
|
||||
sec, unresolved_reloc, info,
|
||||
warned);
|
||||
|
||||
h = (struct elf32_mn10300_link_hash_entry *) hh;
|
||||
|
||||
if ((h->root.root.type == bfd_link_hash_defined
|
||||
|| h->root.root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.root.u.def.section;
|
||||
if ( r_type == R_MN10300_GOTPC32
|
||||
&& ( r_type == R_MN10300_GOTPC32
|
||||
|| r_type == R_MN10300_GOTPC16
|
||||
|| (( r_type == R_MN10300_PLT32
|
||||
|| r_type == R_MN10300_PLT16)
|
||||
@ -1615,41 +1619,17 @@ mn10300_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
do anything with them here. */
|
||||
|| ((input_section->flags & SEC_DEBUGGING) != 0
|
||||
&& (h->root.elf_link_hash_flags
|
||||
& ELF_LINK_HASH_DEF_DYNAMIC) != 0))))
|
||||
{
|
||||
/* In these cases, we don't need the relocation
|
||||
value. We check specially because in some
|
||||
obscure cases sec->output_section will be NULL. */
|
||||
relocation = 0;
|
||||
}
|
||||
else if (sec->output_section == NULL)
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
(_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
|
||||
bfd_get_filename (input_bfd), h->root.root.root.string,
|
||||
bfd_get_section_name (input_bfd, input_section));
|
||||
relocation = 0;
|
||||
}
|
||||
else
|
||||
relocation = (h->root.root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.root.type == bfd_link_hash_undefweak)
|
||||
& ELF_LINK_HASH_DEF_DYNAMIC) != 0)))))
|
||||
/* In these cases, we don't need the relocation
|
||||
value. We check specially because in some
|
||||
obscure cases sec->output_section will be NULL. */
|
||||
relocation = 0;
|
||||
else if (info->shared && !info->symbolic && !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
|
||||
relocation = 0;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(!info->shared || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->root.other)))))
|
||||
return FALSE;
|
||||
relocation = 0;
|
||||
}
|
||||
|
||||
else if (unresolved_reloc)
|
||||
(*_bfd_error_handler)
|
||||
(_("%s: warning: unresolvable relocation against symbol `%s' from %s section"),
|
||||
bfd_get_filename (input_bfd), h->root.root.root.string,
|
||||
bfd_get_section_name (input_bfd, input_section));
|
||||
}
|
||||
|
||||
r = mn10300_elf_final_link_relocate (howto, input_bfd, output_bfd,
|
||||
@ -4626,8 +4606,8 @@ _bfd_mn10300_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||
rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_JMP_SLOT);
|
||||
rel.r_addend = 0;
|
||||
bfd_elf32_swap_reloca_out (output_bfd, &rel,
|
||||
((Elf32_External_Rela *) srel->contents
|
||||
+ plt_index));
|
||||
(bfd_byte *) ((Elf32_External_Rela *) srel->contents
|
||||
+ plt_index));
|
||||
|
||||
if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
|
||||
/* Mark the symbol as undefined, rather than as defined in
|
||||
@ -4673,8 +4653,8 @@ _bfd_mn10300_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||
}
|
||||
|
||||
bfd_elf32_swap_reloca_out (output_bfd, &rel,
|
||||
((Elf32_External_Rela *) srel->contents
|
||||
+ srel->reloc_count));
|
||||
(bfd_byte *) ((Elf32_External_Rela *) srel->contents
|
||||
+ srel->reloc_count));
|
||||
++ srel->reloc_count;
|
||||
}
|
||||
|
||||
@ -4698,8 +4678,8 @@ _bfd_mn10300_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||
rel.r_info = ELF32_R_INFO (h->dynindx, R_MN10300_COPY);
|
||||
rel.r_addend = 0;
|
||||
bfd_elf32_swap_reloca_out (output_bfd, &rel,
|
||||
((Elf32_External_Rela *) s->contents
|
||||
+ s->reloc_count));
|
||||
(bfd_byte *) ((Elf32_External_Rela *) s->contents
|
||||
+ s->reloc_count));
|
||||
++ s->reloc_count;
|
||||
}
|
||||
|
||||
|
@ -1963,19 +1963,16 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
bfd_boolean warned;
|
||||
bfd_boolean unresolved_reloc;
|
||||
|
||||
while ( h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
|
||||
if ( h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation,
|
||||
sec, unresolved_reloc, info,
|
||||
warned);
|
||||
|
||||
if (unresolved_reloc || relocation != 0)
|
||||
{
|
||||
int relocation_needed = 1;
|
||||
|
||||
sec = h->root.u.def.section;
|
||||
|
||||
/* In these cases, we don't need the relocation value.
|
||||
We check specially because in some obscure cases
|
||||
sec->output_section will be NULL. */
|
||||
@ -1998,64 +1995,39 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
&& (h->elf_link_hash_flags
|
||||
& ELF_LINK_HASH_DEF_DYNAMIC) != 0))
|
||||
)
|
||||
relocation_needed = 0;
|
||||
relocation = 0;
|
||||
break;
|
||||
|
||||
case R_ARM_GOTPC:
|
||||
relocation_needed = 0;
|
||||
relocation = 0;
|
||||
break;
|
||||
|
||||
case R_ARM_GOT32:
|
||||
if ((WILL_CALL_FINISH_DYNAMIC_SYMBOL
|
||||
(elf_hash_table(info)->dynamic_sections_created,
|
||||
(elf_hash_table (info)->dynamic_sections_created,
|
||||
info->shared, h))
|
||||
&& (!info->shared
|
||||
|| (!info->symbolic && h->dynindx != -1)
|
||||
|| (h->elf_link_hash_flags
|
||||
& ELF_LINK_HASH_DEF_REGULAR) == 0))
|
||||
relocation_needed = 0;
|
||||
relocation = 0;
|
||||
break;
|
||||
|
||||
case R_ARM_PLT32:
|
||||
if (h->plt.offset != (bfd_vma)-1)
|
||||
relocation_needed = 0;
|
||||
relocation = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (sec->output_section == NULL)
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
(_("%s: warning: unresolvable relocation %d against symbol `%s' from %s section"),
|
||||
bfd_archive_filename (input_bfd),
|
||||
r_type,
|
||||
h->root.root.string,
|
||||
bfd_get_section_name (input_bfd, input_section));
|
||||
relocation_needed = 0;
|
||||
}
|
||||
if (unresolved_reloc)
|
||||
_bfd_error_handler
|
||||
(_("%s: warning: unresolvable relocation %d against symbol `%s' from %s section"),
|
||||
bfd_archive_filename (input_bfd),
|
||||
r_type,
|
||||
h->root.root.string,
|
||||
bfd_get_section_name (input_bfd, input_section));
|
||||
break;
|
||||
}
|
||||
|
||||
if (relocation_needed)
|
||||
relocation = h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset;
|
||||
else
|
||||
relocation = 0;
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
relocation = 0;
|
||||
else if (info->shared && !info->symbolic
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
relocation = 0;
|
||||
else
|
||||
{
|
||||
if (!((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(!info->shared || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
relocation = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
107
bfd/elf32-cris.c
107
bfd/elf32-cris.c
@ -856,24 +856,12 @@ cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
/* It seems this can happen with erroneous or unsupported input
|
||||
(mixing a.out and elf in an archive, for example.) */
|
||||
if (sym_hashes == NULL)
|
||||
return FALSE;
|
||||
bfd_boolean warned;
|
||||
bfd_boolean unresolved_reloc;
|
||||
|
||||
h = sym_hashes [r_symndx - symtab_hdr->sh_info];
|
||||
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
|
||||
symname = h->root.root.string;
|
||||
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr, relocation, sec, unresolved_reloc, info, warned);
|
||||
|
||||
if (unresolved_reloc
|
||||
/* Perhaps we should detect the cases that
|
||||
sec->output_section is expected to be NULL like i386 and
|
||||
m68k, but apparently (and according to elfxx-ia64.c) all
|
||||
@ -888,46 +876,45 @@ cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
is *not* dynamically linked against. Thus this will
|
||||
automatically remind us so we can see if there are other
|
||||
valid cases we need to revisit. */
|
||||
if ((sec->output_section == NULL
|
||||
&& (sec->owner->flags & DYNAMIC) != 0)
|
||||
&& (sec->owner->flags & DYNAMIC) != 0)
|
||||
relocation = 0;
|
||||
|
||||
/* Here follow the cases where the relocation value must
|
||||
be zero (or when further handling is simplified when
|
||||
zero). I can't claim to understand the various
|
||||
conditions and they weren't described in the files
|
||||
where I copied them from (elf32-m68k.c and
|
||||
elf32-i386.c), but let's mention examples of where
|
||||
they happen. FIXME: Perhaps define and use a
|
||||
dynamic_symbol_p function like ia64.
|
||||
else if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
/* Here follow the cases where the relocation value must
|
||||
be zero (or when further handling is simplified when
|
||||
zero). I can't claim to understand the various
|
||||
conditions and they weren't described in the files
|
||||
where I copied them from (elf32-m68k.c and
|
||||
elf32-i386.c), but let's mention examples of where
|
||||
they happen. FIXME: Perhaps define and use a
|
||||
dynamic_symbol_p function like ia64.
|
||||
|
||||
- When creating a shared library, we can have an
|
||||
ordinary relocation for a symbol defined in a shared
|
||||
library (perhaps the one we create). We then make
|
||||
the relocation value zero, as the value seen now will
|
||||
be added into the relocation addend in this shared
|
||||
library, but must be handled only at dynamic-link
|
||||
time. FIXME: Not sure this example covers the
|
||||
h->elf_link_hash_flags test, though it's there in
|
||||
other targets. */
|
||||
|| (info->shared
|
||||
&& ((! info->symbolic && h->dynindx != -1)
|
||||
|| (h->elf_link_hash_flags
|
||||
& ELF_LINK_HASH_DEF_REGULAR) == 0)
|
||||
&& (input_section->flags & SEC_ALLOC) != 0
|
||||
&& (r_type == R_CRIS_8
|
||||
|| r_type == R_CRIS_16
|
||||
|| r_type == R_CRIS_32
|
||||
|| r_type == R_CRIS_8_PCREL
|
||||
|| r_type == R_CRIS_16_PCREL
|
||||
|| r_type == R_CRIS_32_PCREL)))
|
||||
- When creating a shared library, we can have an
|
||||
ordinary relocation for a symbol defined in a shared
|
||||
library (perhaps the one we create). We then make
|
||||
the relocation value zero, as the value seen now will
|
||||
be added into the relocation addend in this shared
|
||||
library, but must be handled only at dynamic-link
|
||||
time. FIXME: Not sure this example covers the
|
||||
h->elf_link_hash_flags test, though it's there in
|
||||
other targets. */
|
||||
if (info->shared
|
||||
&& ((! info->symbolic && h->dynindx != -1)
|
||||
|| (h->elf_link_hash_flags
|
||||
& ELF_LINK_HASH_DEF_REGULAR) == 0)
|
||||
&& (input_section->flags & SEC_ALLOC) != 0
|
||||
&& (r_type == R_CRIS_8
|
||||
|| r_type == R_CRIS_16
|
||||
|| r_type == R_CRIS_32
|
||||
|| r_type == R_CRIS_8_PCREL
|
||||
|| r_type == R_CRIS_16_PCREL
|
||||
|| r_type == R_CRIS_32_PCREL))
|
||||
relocation = 0;
|
||||
else if (sec->output_section != NULL)
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
else
|
||||
else if (unresolved_reloc)
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
_bfd_error_handler
|
||||
(_("%s: unresolvable relocation %s against symbol `%s' from %s section"),
|
||||
bfd_archive_filename (input_bfd),
|
||||
cris_elf_howto_table[r_type].name,
|
||||
@ -937,22 +924,6 @@ cris_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
relocation = 0;
|
||||
else if (info->shared
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
relocation = 0;
|
||||
else
|
||||
{
|
||||
if (!(info->callbacks->undefined_symbol
|
||||
(info, symname, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(!info->shared || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
relocation = 0;
|
||||
}
|
||||
}
|
||||
|
||||
switch (r_type)
|
||||
|
@ -2853,7 +2853,7 @@ elf32_hppa_size_stubs
|
||||
else if (hash->elf.root.type == bfd_link_hash_undefined)
|
||||
{
|
||||
if (! (info->shared
|
||||
&& !info->no_undefined
|
||||
&& info->unresolved_syms_in_objects == RM_IGNORE
|
||||
&& (ELF_ST_VISIBILITY (hash->elf.other)
|
||||
== STV_DEFAULT)
|
||||
&& hash->elf.type != STT_PARISC_MILLI))
|
||||
@ -3444,43 +3444,33 @@ elf32_hppa_relocate_section (bfd *output_bfd,
|
||||
}
|
||||
else
|
||||
{
|
||||
int indx;
|
||||
struct elf_link_hash_entry *hh;
|
||||
bfd_boolean unresolved_reloc;
|
||||
|
||||
/* It's a global; Find its entry in the link hash. */
|
||||
indx = r_symndx - symtab_hdr->sh_info;
|
||||
h = ((struct elf32_hppa_link_hash_entry *)
|
||||
elf_sym_hashes (input_bfd)[indx]);
|
||||
while (h->elf.root.type == bfd_link_hash_indirect
|
||||
|| h->elf.root.type == bfd_link_hash_warning)
|
||||
h = (struct elf32_hppa_link_hash_entry *) h->elf.root.u.i.link;
|
||||
RELOC_FOR_GLOBAL_SYMBOL (hh, elf_sym_hashes (input_bfd), r_symndx, symtab_hdr,
|
||||
relocation, sym_sec, unresolved_reloc, info,
|
||||
warned_undef);
|
||||
|
||||
relocation = 0;
|
||||
if (h->elf.root.type == bfd_link_hash_defined
|
||||
|| h->elf.root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sym_sec = h->elf.root.u.def.section;
|
||||
/* If sym_sec->output_section is NULL, then it's a
|
||||
symbol defined in a shared library. */
|
||||
if (sym_sec->output_section != NULL)
|
||||
relocation = (h->elf.root.u.def.value
|
||||
+ sym_sec->output_offset
|
||||
+ sym_sec->output_section->vma);
|
||||
}
|
||||
else if (h->elf.root.type == bfd_link_hash_undefweak)
|
||||
;
|
||||
else if (info->shared
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
|
||||
&& h->elf.type != STT_PARISC_MILLI)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (!((*info->callbacks->undefined_symbol)
|
||||
(info, h->elf.root.root.string, input_bfd,
|
||||
input_section, rel->r_offset, TRUE)))
|
||||
return FALSE;
|
||||
warned_undef = TRUE;
|
||||
if (relocation == 0
|
||||
&& hh->root.type != bfd_link_hash_defined
|
||||
&& hh->root.type != bfd_link_hash_defweak
|
||||
&& hh->root.type != bfd_link_hash_undefweak)
|
||||
{
|
||||
if (!info->executable
|
||||
&& info->unresolved_syms_in_objects == RM_IGNORE
|
||||
&& ELF_ST_VISIBILITY (hh->other) == STV_DEFAULT
|
||||
&& hh->type == STT_PARISC_MILLI)
|
||||
{
|
||||
if (! info->callbacks->undefined_symbol
|
||||
(info, hh->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
((info->shared && info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
|
||||
|| (!info->shared && info->unresolved_syms_in_objects == RM_GENERATE_ERROR))))
|
||||
return FALSE;
|
||||
warned_undef = TRUE;
|
||||
}
|
||||
}
|
||||
h = (struct elf32_hppa_link_hash_entry *) hh;
|
||||
}
|
||||
|
||||
/* Do any required modifications to the relocation value, and
|
||||
|
@ -2154,42 +2154,9 @@ elf_i386_relocate_section (bfd *output_bfd,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
bfd_boolean warned;
|
||||
|
||||
relocation = 0;
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
if (sec->output_section == NULL)
|
||||
/* Set a flag that will be cleared later if we find a
|
||||
relocation value for this symbol. output_section
|
||||
is typically NULL for symbols satisfied by a shared
|
||||
library. */
|
||||
unresolved_reloc = TRUE;
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
;
|
||||
else if (!info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(info->executable || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
}
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr, relocation, sec, unresolved_reloc, info, warned);
|
||||
}
|
||||
|
||||
switch (r_type)
|
||||
|
@ -1532,33 +1532,12 @@ ip2k_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes [r_symndx - symtab_hdr->sh_info];
|
||||
bfd_boolean warned;
|
||||
bfd_boolean unresolved_reloc;
|
||||
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr, relocation, sec, unresolved_reloc, info, warned);
|
||||
|
||||
name = h->root.root.string;
|
||||
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
relocation = h->root.u.def.value + BASEADDR (sec);
|
||||
}
|
||||
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
relocation = 0;
|
||||
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(! info->shared || info->no_undefined))))
|
||||
return FALSE;
|
||||
relocation = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Finally, the sole IP2K-specific part. */
|
||||
|
@ -618,48 +618,14 @@ iq2000_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes [r_symndx];
|
||||
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
bfd_boolean unresolved_reloc;
|
||||
bfd_boolean warned;
|
||||
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation,
|
||||
sec, unresolved_reloc, info, warned);
|
||||
|
||||
name = h->root.root.string;
|
||||
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr,
|
||||
"defined: sec: %s, name: %s, value: %x + %x + %x gives: %x\n",
|
||||
sec->name, name, h->root.u.def.value,
|
||||
sec->output_section->vma, sec->output_offset, relocation);
|
||||
#endif
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "undefined: sec: %s, name: %s\n",
|
||||
sec->name, name);
|
||||
#endif
|
||||
relocation = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(!info->shared || info->no_undefined))))
|
||||
return FALSE;
|
||||
#ifdef DEBUG
|
||||
fprintf (stderr, "unknown: name: %s\n", name);
|
||||
#endif
|
||||
relocation = 0;
|
||||
}
|
||||
}
|
||||
|
||||
switch (r_type)
|
||||
|
@ -1398,6 +1398,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
sym = NULL;
|
||||
sec = NULL;
|
||||
unresolved_reloc = FALSE;
|
||||
|
||||
if (r_symndx < symtab_hdr->sh_info)
|
||||
{
|
||||
sym = local_syms + r_symndx;
|
||||
@ -1406,42 +1407,9 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
bfd_boolean warned;
|
||||
|
||||
relocation = 0;
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
if (sec->output_section == NULL)
|
||||
/* Set a flag that will be cleared later if we find a
|
||||
relocation value for this symbol. output_section
|
||||
is typically NULL for symbols satisfied by a shared
|
||||
library. */
|
||||
unresolved_reloc = TRUE;
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
;
|
||||
else if (info->shared
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (!(info->callbacks->undefined_symbol
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(!info->shared || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
}
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr, relocation, sec, unresolved_reloc, info, warned);
|
||||
}
|
||||
|
||||
switch (r_type)
|
||||
|
@ -4718,6 +4718,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
||||
unresolved_reloc = FALSE;
|
||||
warned = FALSE;
|
||||
r_symndx = ELF32_R_SYM (rel->r_info);
|
||||
|
||||
if (r_symndx < symtab_hdr->sh_info)
|
||||
{
|
||||
sym = local_syms + r_symndx;
|
||||
@ -4728,44 +4729,12 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation, sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
|
||||
sym_name = h->root.root.string;
|
||||
|
||||
relocation = 0;
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
/* Set a flag that will be cleared later if we find a
|
||||
relocation value for this symbol. output_section
|
||||
is typically NULL for symbols satisfied by a shared
|
||||
library. */
|
||||
if (sec->output_section == NULL)
|
||||
unresolved_reloc = TRUE;
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
;
|
||||
else if (!info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd, input_section,
|
||||
rel->r_offset, (info->executable
|
||||
|| info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
warned = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* TLS optimizations. Replace instruction sequences and relocs
|
||||
@ -5500,49 +5469,16 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
||||
}
|
||||
else
|
||||
{
|
||||
long indx;
|
||||
bfd_boolean warned;
|
||||
bfd_boolean unresolved_reloc;
|
||||
|
||||
indx = r_symndx - symtab_hdr->sh_info;
|
||||
h = elf_sym_hashes (input_bfd)[indx];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
|
||||
value = 0;
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sym_sec = h->root.u.def.section;
|
||||
|
||||
/* Detect the cases that sym_sec->output_section is
|
||||
expected to be NULL -- all cases in which the symbol
|
||||
is defined in another shared module. This includes
|
||||
PLT relocs for which we've created a PLT entry and
|
||||
other relocs for which we're prepared to create
|
||||
dynamic relocations. */
|
||||
/* ??? Just accept it NULL and continue. */
|
||||
|
||||
if (sym_sec->output_section != NULL)
|
||||
{
|
||||
value = (h->root.u.def.value
|
||||
+ sym_sec->output_section->vma
|
||||
+ sym_sec->output_offset);
|
||||
}
|
||||
}
|
||||
else if (!info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(info->executable || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
continue;
|
||||
}
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, elf_sym_hashes (input_bfd),
|
||||
r_symndx, symtab_hdr,
|
||||
value, sym_sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
if (warned)
|
||||
continue;
|
||||
}
|
||||
hit_addr = contents + rel->r_offset;
|
||||
value += rel->r_addend;
|
||||
|
@ -2331,45 +2331,12 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
bfd_boolean warned ATTRIBUTE_UNUSED;
|
||||
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
if (sec->output_section == NULL)
|
||||
{
|
||||
/* Set a flag that will be cleared later if we find a
|
||||
relocation value for this symbol. output_section
|
||||
is typically NULL for symbols satisfied by a shared
|
||||
library. */
|
||||
unresolved_reloc = TRUE;
|
||||
relocation = 0;
|
||||
}
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
relocation = 0;
|
||||
else if (!info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
relocation = 0;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(info->executable || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
relocation = 0;
|
||||
}
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation, sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
}
|
||||
|
||||
switch (r_type)
|
||||
|
@ -4663,6 +4663,8 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
}
|
||||
else
|
||||
{
|
||||
/* FIXME: Ought to make use of the RELOC_FOR_GLOBAL_SYMBOL macro. */
|
||||
|
||||
/* Section symbol are never (?) placed in the hash table, so
|
||||
we can just ignore hash relocations when creating a
|
||||
relocatable object file. */
|
||||
@ -4765,16 +4767,17 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
relocation = 0;
|
||||
else if (! info->executable
|
||||
&& ! info->no_undefined
|
||||
&& info->unresolved_syms_in_objects == RM_IGNORE
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
relocation = 0;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(info->executable || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
if (! info->callbacks->undefined_symbol
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
((info->shared && info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
|
||||
|| (!info->shared && info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
|
||||
|| ELF_ST_VISIBILITY (h->other))))
|
||||
return FALSE;
|
||||
relocation = 0;
|
||||
}
|
||||
|
@ -2186,42 +2186,12 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
bfd_boolean warned ATTRIBUTE_UNUSED;
|
||||
|
||||
relocation = 0;
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
if (sec->output_section == NULL)
|
||||
/* Set a flag that will be cleared later if we find a
|
||||
relocation value for this symbol. output_section
|
||||
is typically NULL for symbols satisfied by a shared
|
||||
library. */
|
||||
unresolved_reloc = TRUE;
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
;
|
||||
else if (!info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(info->executable || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
}
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation, sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
}
|
||||
|
||||
switch (r_type)
|
||||
|
@ -1487,15 +1487,17 @@ elf_vax_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
bfd_boolean unresolved_reloc;
|
||||
bfd_boolean warned;
|
||||
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation, sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
|
||||
if ((h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
if ((r_type == R_VAX_PLT32
|
||||
&& ((r_type == R_VAX_PLT32
|
||||
&& h->plt.offset != (bfd_vma) -1
|
||||
&& elf_hash_table (info)->dynamic_sections_created)
|
||||
|| (r_type == R_VAX_GOT32
|
||||
@ -1524,34 +1526,11 @@ elf_vax_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
|| r_type == R_VAX_32
|
||||
|| r_type == R_VAX_PC8
|
||||
|| r_type == R_VAX_PC16
|
||||
|| r_type == R_VAX_PC32)))
|
||||
{
|
||||
/* In these cases, we don't need the relocation
|
||||
value. We check specially because in some
|
||||
obscure cases sec->output_section will be NULL. */
|
||||
relocation = 0;
|
||||
}
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
|| r_type == R_VAX_PC32))))
|
||||
/* In these cases, we don't need the relocation
|
||||
value. We check specially because in some
|
||||
obscure cases sec->output_section will be NULL. */
|
||||
relocation = 0;
|
||||
else if (info->shared
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
relocation = 0;
|
||||
else
|
||||
{
|
||||
if (!(info->callbacks->undefined_symbol
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(!info->shared || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
relocation = 0;
|
||||
}
|
||||
}
|
||||
|
||||
switch (r_type)
|
||||
|
@ -2009,45 +2009,15 @@ elf_xtensa_relocate_section (output_bfd, info, input_bfd,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation, sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
|
||||
relocation = 0;
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
|
||||
if (sec->output_section == NULL)
|
||||
/* Set a flag that will be cleared later if we find a
|
||||
relocation value for this symbol. output_section
|
||||
is typically NULL for symbols satisfied by a shared
|
||||
library. */
|
||||
unresolved_reloc = TRUE;
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
if (relocation == 0
|
||||
&& !unresolved_reloc
|
||||
&& h->root.type == bfd_link_hash_undefweak)
|
||||
is_weak_undef = TRUE;
|
||||
else if (info->shared
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(!info->shared || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
warned = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (relaxing_section)
|
||||
@ -3575,6 +3545,7 @@ hash_literal_value (src)
|
||||
const literal_value *src;
|
||||
{
|
||||
unsigned hash_val;
|
||||
|
||||
if (r_reloc_is_const (&src->r_rel))
|
||||
return hash_bfd_vma (src->value);
|
||||
|
||||
@ -3583,9 +3554,9 @@ hash_literal_value (src)
|
||||
|
||||
/* Now check for the same section and the same elf_hash. */
|
||||
if (r_reloc_is_defined (&src->r_rel))
|
||||
hash_val += hash_bfd_vma ((bfd_vma) r_reloc_get_section (&src->r_rel));
|
||||
hash_val += hash_bfd_vma ((bfd_vma) (unsigned) r_reloc_get_section (&src->r_rel));
|
||||
else
|
||||
hash_val += hash_bfd_vma ((bfd_vma) r_reloc_get_hash_entry (&src->r_rel));
|
||||
hash_val += hash_bfd_vma ((bfd_vma) (unsigned) r_reloc_get_hash_entry (&src->r_rel));
|
||||
|
||||
return hash_val;
|
||||
}
|
||||
|
@ -3074,7 +3074,7 @@ elf64_alpha_check_relocs (abfd, info, sec, relocs)
|
||||
this may help reduce memory usage and processing time later. */
|
||||
maybe_dynamic = FALSE;
|
||||
if (h && ((info->shared
|
||||
&& (!info->symbolic || info->allow_shlib_undefined))
|
||||
&& (!info->symbolic || info->unresolved_syms_in_shared_libs == RM_IGNORE))
|
||||
|| ! (h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)
|
||||
|| h->root.root.type == bfd_link_hash_defweak))
|
||||
maybe_dynamic = TRUE;
|
||||
@ -4445,48 +4445,25 @@ elf64_alpha_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = alpha_elf_sym_hashes (input_bfd)[r_symndx - symtab_hdr->sh_info];
|
||||
bfd_boolean warned;
|
||||
bfd_boolean unresolved_reloc;
|
||||
struct elf_link_hash_entry *hh;
|
||||
|
||||
RELOC_FOR_GLOBAL_SYMBOL (hh,
|
||||
(struct elf_link_hash_entry *) alpha_elf_sym_hashes (input_bfd),
|
||||
r_symndx, symtab_hdr, value,
|
||||
sec, unresolved_reloc, info,
|
||||
warned);
|
||||
|
||||
while (h->root.root.type == bfd_link_hash_indirect
|
||||
|| h->root.root.type == bfd_link_hash_warning)
|
||||
h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
|
||||
if (warned)
|
||||
continue;
|
||||
|
||||
value = 0;
|
||||
if (h->root.root.type == bfd_link_hash_defined
|
||||
|| h->root.root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.root.u.def.section;
|
||||
|
||||
/* Detect the cases that sym_sec->output_section is
|
||||
expected to be NULL -- all cases in which the symbol
|
||||
is defined in another shared module. This includes
|
||||
PLT relocs for which we've created a PLT entry and
|
||||
other relocs for which we're prepared to create
|
||||
dynamic relocations. */
|
||||
/* ??? Just accept it NULL and continue. */
|
||||
|
||||
if (sec->output_section != NULL)
|
||||
value = (h->root.root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.root.type == bfd_link_hash_undefweak)
|
||||
if (value == 0
|
||||
&& ! unresolved_reloc
|
||||
&& hh->root.type == bfd_link_hash_undefweak)
|
||||
undef_weak_ref = TRUE;
|
||||
else if (!info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (!((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(info->executable || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->root.other)))))
|
||||
return FALSE;
|
||||
continue;
|
||||
}
|
||||
|
||||
h = (struct alpha_elf_link_hash_entry *) hh;
|
||||
dynamic_symbol_p = alpha_elf_dynamic_symbol_p (&h->root, info);
|
||||
gotent = h->got_entries;
|
||||
}
|
||||
|
@ -710,13 +710,14 @@ elf64_hppa_check_relocs (abfd, info, sec, relocs)
|
||||
relend = relocs + sec->reloc_count;
|
||||
for (rel = relocs; rel < relend; ++rel)
|
||||
{
|
||||
enum {
|
||||
NEED_DLT = 1,
|
||||
NEED_PLT = 2,
|
||||
NEED_STUB = 4,
|
||||
NEED_OPD = 8,
|
||||
NEED_DYNREL = 16,
|
||||
};
|
||||
enum
|
||||
{
|
||||
NEED_DLT = 1,
|
||||
NEED_PLT = 2,
|
||||
NEED_STUB = 4,
|
||||
NEED_OPD = 8,
|
||||
NEED_DYNREL = 16,
|
||||
};
|
||||
|
||||
struct elf_link_hash_entry *h = NULL;
|
||||
unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
|
||||
@ -746,7 +747,7 @@ elf64_hppa_check_relocs (abfd, info, sec, relocs)
|
||||
this may help reduce memory usage and processing time later. */
|
||||
maybe_dynamic = FALSE;
|
||||
if (h && ((info->shared
|
||||
&& (!info->symbolic || info->allow_shlib_undefined) )
|
||||
&& (!info->symbolic || info->unresolved_syms_in_shared_libs == RM_IGNORE))
|
||||
|| ! (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)
|
||||
|| h->root.type == bfd_link_hash_defweak))
|
||||
maybe_dynamic = TRUE;
|
||||
|
@ -7362,44 +7362,11 @@ ppc64_elf_relocate_section (bfd *output_bfd,
|
||||
}
|
||||
else
|
||||
{
|
||||
/* It's a global symbol. */
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation, sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
sym_name = h->root.root.string;
|
||||
relocation = 0;
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
if (sec->output_section == NULL)
|
||||
/* Set a flag that will be cleared later if we find a
|
||||
relocation value for this symbol. output_section
|
||||
is typically NULL for symbols satisfied by a shared
|
||||
library. */
|
||||
unresolved_reloc = TRUE;
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
;
|
||||
else if (!info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd, input_section,
|
||||
rel->r_offset, (info->executable
|
||||
|| info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
warned = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* TLS optimizations. Replace instruction sequences and relocs
|
||||
|
@ -2301,45 +2301,12 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
bfd_boolean warned ATTRIBUTE_UNUSED;
|
||||
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
if (sec->output_section == NULL)
|
||||
{
|
||||
/* Set a flag that will be cleared later if we find a
|
||||
relocation value for this symbol. output_section
|
||||
is typically NULL for symbols satisfied by a shared
|
||||
library. */
|
||||
unresolved_reloc = TRUE;
|
||||
relocation = 0;
|
||||
}
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
relocation = 0;
|
||||
else if (!info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
relocation = 0;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(info->executable || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
relocation = 0;
|
||||
}
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation, sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
}
|
||||
|
||||
switch (r_type)
|
||||
|
@ -1610,6 +1610,8 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ??? Could we use the RELOC_FOR_GLOBAL_SYMBOL macro here ? */
|
||||
|
||||
/* Section symbols are never (?) placed in the hash table, so
|
||||
we can just ignore hash relocations when creating a
|
||||
relocatable object file. */
|
||||
@ -1699,7 +1701,9 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
relocation = 0;
|
||||
else if (info->shared && !info->symbolic && !info->no_undefined)
|
||||
else if (info->shared
|
||||
&& !info->symbolic
|
||||
&& info->unresolved_syms_in_objects == RM_IGNORE)
|
||||
relocation = 0;
|
||||
else
|
||||
{
|
||||
|
@ -2074,42 +2074,14 @@ sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
bfd_boolean warned;
|
||||
|
||||
relocation = 0;
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation, sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
if (warned)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
if (sec->output_section == NULL)
|
||||
/* Set a flag that will be cleared later if we find a
|
||||
relocation value for this symbol. output_section
|
||||
is typically NULL for symbols satisfied by a shared
|
||||
library. */
|
||||
unresolved_reloc = TRUE;
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
;
|
||||
else if (!info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(info->executable || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
|
||||
/* To avoid generating warning messages about truncated
|
||||
relocations, set the relocation's address to be the same as
|
||||
the start of this section. */
|
||||
|
@ -1827,45 +1827,12 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
}
|
||||
else
|
||||
{
|
||||
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
bfd_boolean warned;
|
||||
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sec = h->root.u.def.section;
|
||||
if (sec->output_section == NULL)
|
||||
{
|
||||
/* Set a flag that will be cleared later if we find a
|
||||
relocation value for this symbol. output_section
|
||||
is typically NULL for symbols satisfied by a shared
|
||||
library. */
|
||||
unresolved_reloc = TRUE;
|
||||
relocation = 0;
|
||||
}
|
||||
else
|
||||
relocation = (h->root.u.def.value
|
||||
+ sec->output_section->vma
|
||||
+ sec->output_offset);
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
relocation = 0;
|
||||
else if (!info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
relocation = 0;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(info->executable || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
relocation = 0;
|
||||
}
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx,
|
||||
symtab_hdr, relocation, sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
}
|
||||
/* When generating a shared object, the relocations handled here are
|
||||
copied into the output file to be resolved at run time. */
|
||||
|
@ -4363,24 +4363,19 @@ elf_link_output_extsym (struct elf_link_hash_entry *h, void *data)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* If we are not creating a shared library, and this symbol is
|
||||
referenced by a shared library but is not defined anywhere, then
|
||||
warn that it is undefined. If we do not do this, the runtime
|
||||
linker will complain that the symbol is undefined when the
|
||||
program is run. We don't have to worry about symbols that are
|
||||
referenced by regular files, because we will already have issued
|
||||
warnings for them. */
|
||||
if (! finfo->info->relocatable
|
||||
&& (finfo->info->executable
|
||||
|| ! finfo->info->allow_shlib_undefined)
|
||||
&& h->root.type == bfd_link_hash_undefined
|
||||
/* If we have an undefined symbol reference here then it must have
|
||||
come from a shared library that is being linked in. (Undefined
|
||||
references in regular files have already been handled). If we
|
||||
are reporting errors for this situation then do so now. */
|
||||
if (h->root.type == bfd_link_hash_undefined
|
||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
|
||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
|
||||
&& ! elf_link_check_versioned_symbol (finfo->info, h))
|
||||
&& ! elf_link_check_versioned_symbol (finfo->info, h)
|
||||
&& finfo->info->unresolved_syms_in_shared_libs != RM_IGNORE)
|
||||
{
|
||||
if (! ((*finfo->info->callbacks->undefined_symbol)
|
||||
(finfo->info, h->root.root.string, h->root.u.undef.abfd,
|
||||
NULL, 0, TRUE)))
|
||||
NULL, 0, finfo->info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)))
|
||||
{
|
||||
eoinfo->failed = TRUE;
|
||||
return FALSE;
|
||||
@ -4390,10 +4385,9 @@ elf_link_output_extsym (struct elf_link_hash_entry *h, void *data)
|
||||
/* We should also warn if a forced local symbol is referenced from
|
||||
shared libraries. */
|
||||
if (! finfo->info->relocatable
|
||||
&& (! finfo->info->shared || ! finfo->info->allow_shlib_undefined)
|
||||
&& (! finfo->info->shared)
|
||||
&& (h->elf_link_hash_flags
|
||||
& (ELF_LINK_FORCED_LOCAL | ELF_LINK_HASH_REF_DYNAMIC
|
||||
| ELF_LINK_DYNAMIC_DEF | ELF_LINK_DYNAMIC_WEAK))
|
||||
& (ELF_LINK_FORCED_LOCAL | ELF_LINK_HASH_REF_DYNAMIC | ELF_LINK_DYNAMIC_DEF | ELF_LINK_DYNAMIC_WEAK))
|
||||
== (ELF_LINK_FORCED_LOCAL | ELF_LINK_HASH_REF_DYNAMIC)
|
||||
&& ! elf_link_check_versioned_symbol (finfo->info, h))
|
||||
{
|
||||
|
@ -2162,7 +2162,7 @@ elfNN_ia64_check_relocs (abfd, info, sec, relocs)
|
||||
this may help reduce memory usage and processing time later. */
|
||||
maybe_dynamic = FALSE;
|
||||
if (h && ((!info->executable
|
||||
&& (!info->symbolic || info->allow_shlib_undefined))
|
||||
&& (!info->symbolic || info->unresolved_syms_in_shared_libs == RM_IGNORE))
|
||||
|| ! (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)
|
||||
|| h->root.type == bfd_link_hash_defweak))
|
||||
maybe_dynamic = TRUE;
|
||||
@ -3852,52 +3852,19 @@ elfNN_ia64_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||
}
|
||||
else
|
||||
{
|
||||
long indx;
|
||||
bfd_boolean unresolved_reloc;
|
||||
bfd_boolean warned;
|
||||
|
||||
/* Reloc against global symbol. */
|
||||
indx = r_symndx - symtab_hdr->sh_info;
|
||||
h = elf_sym_hashes (input_bfd)[indx];
|
||||
while (h->root.type == bfd_link_hash_indirect
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
RELOC_FOR_GLOBAL_SYMBOL (h, elf_sym_hashes (input_bfd),
|
||||
r_symndx,
|
||||
symtab_hdr, value, sym_sec,
|
||||
unresolved_reloc, info,
|
||||
warned);
|
||||
|
||||
value = 0;
|
||||
if (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
{
|
||||
sym_sec = h->root.u.def.section;
|
||||
|
||||
/* Detect the cases that sym_sec->output_section is
|
||||
expected to be NULL -- all cases in which the symbol
|
||||
is defined in another shared module. This includes
|
||||
PLT relocs for which we've created a PLT entry and
|
||||
other relocs for which we're prepared to create
|
||||
dynamic relocations. */
|
||||
/* ??? Just accept it NULL and continue. */
|
||||
|
||||
if (sym_sec->output_section != NULL)
|
||||
{
|
||||
value = (h->root.u.def.value
|
||||
+ sym_sec->output_section->vma
|
||||
+ sym_sec->output_offset);
|
||||
}
|
||||
}
|
||||
else if (h->root.type == bfd_link_hash_undefweak)
|
||||
if (h->root.type == bfd_link_hash_undefweak)
|
||||
undef_weak_ref = TRUE;
|
||||
else if (! info->executable
|
||||
&& !info->no_undefined
|
||||
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
|
||||
;
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.string, input_bfd,
|
||||
input_section, rel->r_offset,
|
||||
(info->executable || info->no_undefined
|
||||
|| ELF_ST_VISIBILITY (h->other)))))
|
||||
return FALSE;
|
||||
continue;
|
||||
}
|
||||
else if (warned)
|
||||
continue;
|
||||
}
|
||||
|
||||
hit_addr = contents + rel->r_offset;
|
||||
|
@ -3008,6 +3008,8 @@ mips_elf_calculate_relocation (abfd, input_bfd, input_section, info,
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ? */
|
||||
|
||||
/* For global symbols we look up the symbol in the hash-table. */
|
||||
h = ((struct mips_elf_link_hash_entry *)
|
||||
elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
|
||||
@ -3021,7 +3023,7 @@ mips_elf_calculate_relocation (abfd, input_bfd, input_section, info,
|
||||
|
||||
/* See if this is the special _gp_disp symbol. Note that such a
|
||||
symbol must always be a global symbol. */
|
||||
if (strcmp (h->root.root.root.string, "_gp_disp") == 0
|
||||
if (strcmp (*namep, "_gp_disp") == 0
|
||||
&& ! NEWABI_P (input_bfd))
|
||||
{
|
||||
/* Relocations against _gp_disp are permitted only with
|
||||
@ -3054,11 +3056,11 @@ mips_elf_calculate_relocation (abfd, input_bfd, input_section, info,
|
||||
addresses. */
|
||||
symbol = 0;
|
||||
else if (info->shared
|
||||
&& !info->no_undefined
|
||||
&& info->unresolved_syms_in_objects == RM_IGNORE
|
||||
&& ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
|
||||
symbol = 0;
|
||||
else if (strcmp (h->root.root.root.string, "_DYNAMIC_LINK") == 0 ||
|
||||
strcmp (h->root.root.root.string, "_DYNAMIC_LINKING") == 0)
|
||||
else if (strcmp (*namep, "_DYNAMIC_LINK") == 0 ||
|
||||
strcmp (*namep, "_DYNAMIC_LINKING") == 0)
|
||||
{
|
||||
/* If this is a dynamic link, we should have created a
|
||||
_DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
|
||||
@ -3075,7 +3077,8 @@ mips_elf_calculate_relocation (abfd, input_bfd, input_section, info,
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
(info, h->root.root.root.string, input_bfd,
|
||||
input_section, relocation->r_offset,
|
||||
(!info->shared || info->no_undefined
|
||||
((info->shared && info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
|
||||
|| (!info->shared && info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
|
||||
|| ELF_ST_VISIBILITY (h->root.other)))))
|
||||
return bfd_reloc_undefined;
|
||||
symbol = 0;
|
||||
|
@ -1,3 +1,12 @@
|
||||
2003-08-20 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* bfdlink.h (enum report_method): New enum. Describes how to
|
||||
report something.
|
||||
(struct bfd_link_info): Delete fields 'no_undefined' and
|
||||
'allow_shlib_undefined'. Replace with
|
||||
'unresolved_symbols_in_objects' and
|
||||
'unresolved_symbols_in_shared_libs'.
|
||||
|
||||
2003-08-07 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* bfdlink.h: Remove PARAMS macro. Replace PTR with void *.
|
||||
|
@ -198,6 +198,19 @@ struct bfd_sym_chain
|
||||
const char *name;
|
||||
};
|
||||
|
||||
/* How to handle unresolved symbols.
|
||||
There are four possibilities which are enumerated below: */
|
||||
enum report_method
|
||||
{
|
||||
/* This is the initial value when then link_info structure is created.
|
||||
It allows the various stages of the linker to determine whether they
|
||||
allowed to set the value. */
|
||||
RM_NOT_YET_SET = 0,
|
||||
RM_IGNORE,
|
||||
RM_GENERATE_WARNING,
|
||||
RM_GENERATE_ERROR
|
||||
};
|
||||
|
||||
/* This structure holds all the information needed to communicate
|
||||
between BFD and the linker when doing a link. */
|
||||
|
||||
@ -238,24 +251,6 @@ struct bfd_link_info
|
||||
need much more time and therefore must be explicitly selected. */
|
||||
unsigned int optimize: 1;
|
||||
|
||||
/* TRUE if BFD should generate errors for undefined symbols
|
||||
even if generating a shared object. */
|
||||
unsigned int no_undefined: 1;
|
||||
|
||||
/* TRUE if BFD should allow undefined symbols in shared objects even
|
||||
when no_undefined is set to disallow undefined symbols. The net
|
||||
result will be that undefined symbols in regular objects will
|
||||
still trigger an error, but undefined symbols in shared objects
|
||||
will be ignored. The implementation of no_undefined makes the
|
||||
assumption that the runtime linker will choke on undefined
|
||||
symbols. However there is at least one system (BeOS) where
|
||||
undefined symbols in shared libraries is normal since the kernel
|
||||
patches them at load time to select which function is most
|
||||
appropriate for the current architecture. I.E. dynamically
|
||||
select an appropriate memset function. Apparently it is also
|
||||
normal for HPPA shared libraries to have undefined symbols. */
|
||||
unsigned int allow_shlib_undefined: 1;
|
||||
|
||||
/* TRUE if ok to have multiple definition. */
|
||||
unsigned int allow_multiple_definition: 1;
|
||||
|
||||
@ -305,6 +300,17 @@ struct bfd_link_info
|
||||
flags. */
|
||||
unsigned int noexecstack: 1;
|
||||
|
||||
/* What to do with unresolved symbols in an object file.
|
||||
When producing static binaries the default is GENERATE_ERROR.
|
||||
When producing dynamic binaries the default is IGNORE. The
|
||||
assumption with dynamic binaries is that the reference will be
|
||||
resolved at load/execution time. */
|
||||
enum report_method unresolved_syms_in_objects;
|
||||
|
||||
/* What to do with unresolved symbols in a shared library.
|
||||
The same defaults apply. */
|
||||
enum report_method unresolved_syms_in_shared_libs;
|
||||
|
||||
/* Which symbols to strip. */
|
||||
enum bfd_link_strip strip;
|
||||
|
||||
|
17
ld/ChangeLog
17
ld/ChangeLog
@ -1,3 +1,20 @@
|
||||
2003-08-20 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* ldmain.c: Initialise the new fields in bfd_link_info to
|
||||
NOT_YET_SET.
|
||||
* lexsup.c (enum option_values): New enum. Use this to
|
||||
replace the handed coded values for the long switch options.
|
||||
(ld_options): Add 'unresolved-symbols',
|
||||
'warn-unresolved-symbols' and 'error-unresolved-symbols'.
|
||||
(parse_args): Handle the new switches. Set the values of
|
||||
unresolved_symbols_in_objects and
|
||||
unresolved_symbols_in_shared_libs appropriately. If they were
|
||||
not initialised by the command line, install default values.
|
||||
* emultempl/elf32.em (handle_option): Update OPTION_GROUP and
|
||||
-z defs to use the new fields in bfd_link_info.
|
||||
* ld.texinfo: Document the new switches.
|
||||
* NEWS: Mention this feature.
|
||||
|
||||
2003-08-15 Dmitry Diky <diwil@mail.ru>
|
||||
|
||||
* Makefile.am (GENSCRIPTS_EXTRA): New script definition which
|
||||
|
5
ld/NEWS
5
ld/NEWS
@ -1,5 +1,10 @@
|
||||
-*- text -*-
|
||||
|
||||
* Improved linker's handling of unresolved symbols. The switch
|
||||
--unresolved-symbols=<method> has been added to tell the linker when it
|
||||
should report them and the switch --warn-unresolved-symbols has been added to
|
||||
make reports be issued as warning messages rather than errors.
|
||||
|
||||
* Added support for Xtensa architecture.
|
||||
|
||||
* Added --with-sysroot configure switch to specify a target system root, for
|
||||
|
@ -1602,7 +1602,8 @@ cat >>e${EMULATION_NAME}.c <<EOF
|
||||
case OPTION_GROUP:
|
||||
link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
|
||||
/* Groups must be self-contained. */
|
||||
link_info.no_undefined = TRUE;
|
||||
link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
|
||||
link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
|
||||
break;
|
||||
|
||||
case 'z':
|
||||
@ -1631,7 +1632,7 @@ cat >>e${EMULATION_NAME}.c <<EOF
|
||||
link_info.flags_1 |= (bfd_vma) DF_1_ORIGIN;
|
||||
}
|
||||
else if (strcmp (optarg, "defs") == 0)
|
||||
link_info.no_undefined = TRUE;
|
||||
link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
|
||||
else if (strcmp (optarg, "muldefs") == 0)
|
||||
link_info.allow_multiple_definition = TRUE;
|
||||
else if (strcmp (optarg, "combreloc") == 0)
|
||||
@ -1684,7 +1685,7 @@ cat >>e${EMULATION_NAME}.c <<EOF
|
||||
fprintf (file, _(" --enable-new-dtags\tEnable new dynamic tags\n"));
|
||||
fprintf (file, _(" --eh-frame-hdr\tCreate .eh_frame_hdr section\n"));
|
||||
fprintf (file, _(" -z combreloc\t\tMerge dynamic relocs into one section and sort\n"));
|
||||
fprintf (file, _(" -z defs\t\tDisallows undefined symbols\n"));
|
||||
fprintf (file, _(" -z defs\t\tReport unresolved symbols in object files.\n"));
|
||||
fprintf (file, _(" -z execstack\t\tMark executable as requiring executable stack\n"));
|
||||
fprintf (file, _(" -z initfirst\t\tMark DSO to be initialized first at runtime\n"));
|
||||
fprintf (file, _(" -z interpose\t\tMark object to interpose all DSOs but executable\n"));
|
||||
|
114
ld/ld.texinfo
114
ld/ld.texinfo
@ -883,7 +883,8 @@ Combines multiple reloc sections and sorts them to make dynamic symbol
|
||||
lookup caching possible.
|
||||
|
||||
@item defs
|
||||
Disallows undefined symbols.
|
||||
Disallows undefined symbols in object files. Undefined symbols in
|
||||
shared libaries are still allowed.
|
||||
|
||||
@item initfirst
|
||||
This option is only meaningful when building a shared object.
|
||||
@ -984,15 +985,16 @@ for which shared libraries are supported. This option is normally the
|
||||
default on such platforms. The different variants of this option are
|
||||
for compatibility with various systems. You may use this option
|
||||
multiple times on the command line: it affects library searching for
|
||||
@option{-l} options which follow it.
|
||||
@option{-l} options which follow it. This
|
||||
option also implies @option{--unresolved-symbols=ignore-all}.
|
||||
|
||||
@kindex -Bgroup
|
||||
@item -Bgroup
|
||||
Set the @code{DF_1_GROUP} flag in the @code{DT_FLAGS_1} entry in the dynamic
|
||||
section. This causes the runtime linker to handle lookups in this
|
||||
object and its dependencies to be performed only inside the group.
|
||||
@option{--no-undefined} is implied. This option is only meaningful on ELF
|
||||
platforms which support shared libraries.
|
||||
@option{--unresolved-symbols=report-all} is implied. This option is
|
||||
only meaningful on ELF platforms which support shared libraries.
|
||||
|
||||
@kindex -Bstatic
|
||||
@kindex -dn
|
||||
@ -1006,7 +1008,8 @@ Do not link against shared libraries. This is only meaningful on
|
||||
platforms for which shared libraries are supported. The different
|
||||
variants of this option are for compatibility with various systems. You
|
||||
may use this option multiple times on the command line: it affects
|
||||
library searching for @option{-l} options which follow it.
|
||||
library searching for @option{-l} options which follow it. This
|
||||
option also implies @option{--unresolved-symbols=report-all}.
|
||||
|
||||
@kindex -Bsymbolic
|
||||
@item -Bsymbolic
|
||||
@ -1025,7 +1028,7 @@ been assigned to see if there any overlaps. Normally the linker will
|
||||
perform this check, and if it finds any overlaps it will produce
|
||||
suitable error messages. The linker does know about, and does make
|
||||
allowances for sections in overlays. The default behaviour can be
|
||||
restored by using the command line switch @samp{--check-sections}.
|
||||
restored by using the command line switch @option{--check-sections}.
|
||||
|
||||
@cindex cross reference table
|
||||
@kindex --cref
|
||||
@ -1146,7 +1149,7 @@ Print a summary of all target specific options on the standard output and exit.
|
||||
@kindex -Map
|
||||
@item -Map @var{mapfile}
|
||||
Print a link map to the file @var{mapfile}. See the description of the
|
||||
@samp{-M} option, above.
|
||||
@option{-M} option, above.
|
||||
|
||||
@cindex memory usage
|
||||
@kindex --no-keep-memory
|
||||
@ -1161,11 +1164,11 @@ while linking a large executable.
|
||||
@kindex -z defs
|
||||
@item --no-undefined
|
||||
@itemx -z defs
|
||||
Normally when creating a non-symbolic shared library, undefined symbols
|
||||
are allowed and left to be resolved by the runtime loader. This option
|
||||
disallows such undefined symbols if they come from regular object
|
||||
files. The switch @samp{--no-allow-shlib-undefined} controls the
|
||||
behaviour for shared objects being linked into the shared library.
|
||||
Report unresolved symbol references from regular object files. This
|
||||
is done even if the linker is creating a non-symbolic shared library.
|
||||
The switch @option{--[no-]allow-shlib-undefined} controls the
|
||||
behaviour for reporting unresolved references found in shared
|
||||
libraries being linked in.
|
||||
|
||||
@kindex --allow-multiple-definition
|
||||
@kindex -z muldefs
|
||||
@ -1179,22 +1182,21 @@ first definition will be used.
|
||||
@kindex --no-allow-shlib-undefined
|
||||
@item --allow-shlib-undefined
|
||||
@itemx --no-allow-shlib-undefined
|
||||
Allow (the default) or disallow undefined symbols in shared objects.
|
||||
The setting of this switch overrides @samp{--no-undefined} where
|
||||
shared objects are concerned. Thus if @samp{--no-undefined} is set
|
||||
but @samp{--no-allow-shlib-undefined} is not, the net result will be
|
||||
that undefined symbols in regular object files will trigger an error,
|
||||
but undefined symbols in shared objects will be ignored.
|
||||
Allows (the default) or disallows undefined symbols in shared libraries.
|
||||
This switch is similar to @option{--no-undefined} except that it
|
||||
determines the behaviour when the undefined symbols are in a
|
||||
shared library rather than a regular object file. It does not affect
|
||||
how undefined symbols in regular object files are handled.
|
||||
|
||||
The reason that @samp{--allow-shlib-undefined} is the default is that
|
||||
the shared object being specified at link time may not be the same one
|
||||
that is available at load time, so the symbols might actually be
|
||||
The reason that @option{--allow-shlib-undefined} is the default is that
|
||||
the shared library being specified at link time may not be the same as
|
||||
the one that is available at load time, so the symbols might actually be
|
||||
resolvable at load time. Plus there are some systems, (eg BeOS) where
|
||||
undefined symbols in shared libraries is normal since the kernel
|
||||
patches them at load time to select which function is most appropriate
|
||||
for the current architecture. eg. to dynamically select an appropriate
|
||||
memset function. Apparently it is also normal for HPPA shared
|
||||
libraries to have undefined symbols.
|
||||
undefined symbols in shared libraries is normal. (The kernel patches
|
||||
them at load time to select which function is most appropriate
|
||||
for the current architecture. This is used for example to dynamically
|
||||
select an appropriate memset function). Apparently it is also normal
|
||||
for HPPA shared libraries to have undefined symbols.
|
||||
|
||||
@kindex --no-undefined-version
|
||||
@item --no-undefined-version
|
||||
@ -1486,6 +1488,39 @@ sign (``@key{=}''), and @var{org}.
|
||||
Same as --section-start, with @code{.bss}, @code{.data} or
|
||||
@code{.text} as the @var{sectionname}.
|
||||
|
||||
@kindex --unresolved-symbols
|
||||
@item --unresolved-symbols=@var{method}
|
||||
Determine how to handle unresolved symbols. There are four possible
|
||||
values for @samp{method}:
|
||||
|
||||
@table @samp
|
||||
@item ignore-all
|
||||
Do not report any unresolved symbols. This is the default when
|
||||
creating shared libraries or dynamic executables.
|
||||
|
||||
@item report-all
|
||||
Report all unresolved symbols. This is the default when creating
|
||||
static binaries.
|
||||
|
||||
@item ignore-in-object-files
|
||||
Report unresolved symbols that are contained in shared libraries, but
|
||||
ignore them if they come from regular object files.
|
||||
|
||||
@item ignore-in-shared-libs
|
||||
Report unresolved symbols that come from regular object files, but
|
||||
ignore them if they come from shared libraries. This can be useful
|
||||
when creating a dynamic binary and it is known that all the shared
|
||||
libraries that it should be referencing are included on the linker's
|
||||
command line.
|
||||
@end table
|
||||
|
||||
The behaviour for shared libraries on their own can also be controlled
|
||||
by the @option{--[no-]allow-shlib-undefined} option.
|
||||
|
||||
Normally the linker will generate an error message for each reported
|
||||
unresolved symbol but the option @option{--warn-unresolved-symbols}
|
||||
can change this to a warning.
|
||||
|
||||
@kindex --verbose
|
||||
@cindex verbose
|
||||
@item --dll-verbose
|
||||
@ -1508,10 +1543,10 @@ is only meaningful on ELF platforms which support shared libraries.
|
||||
@cindex combining symbols, warnings on
|
||||
@item --warn-common
|
||||
Warn when a common symbol is combined with another common symbol or with
|
||||
a symbol definition. Unix linkers allow this somewhat sloppy practice,
|
||||
a symbol definition. Unix linkers allow this somewhat sloppy practise,
|
||||
but linkers on some other operating systems do not. This option allows
|
||||
you to find potential problems from combining global symbols.
|
||||
Unfortunately, some C libraries use this practice, so you may get some
|
||||
Unfortunately, some C libraries use this practise, so you may get some
|
||||
warnings about symbols in the libraries as well as in your programs.
|
||||
|
||||
There are three kinds of global symbols, illustrated here by C examples:
|
||||
@ -1625,6 +1660,17 @@ The address will only be changed if it not explicitly specified; that
|
||||
is, if the @code{SECTIONS} command does not specify a start address for
|
||||
the section (@pxref{SECTIONS}).
|
||||
|
||||
@kindex --warn-unresolved-symbols
|
||||
@item --warn-unresolved-symbols
|
||||
If the linker is going to report an unresolved symbol (see the option
|
||||
@option{--unresolved-symbols}) it will normally generate an error.
|
||||
This option makes it generate a warning instead.
|
||||
|
||||
@kindex --error-unresolved-symbols
|
||||
@item --error-unresolved-symbols
|
||||
This restores the linker's default behaviour of generating errors when
|
||||
it is reporting unresolved symbols.
|
||||
|
||||
@kindex --whole-archive
|
||||
@cindex including an entire archive
|
||||
@item --whole-archive
|
||||
@ -1871,7 +1917,7 @@ automatically or implicitly exported symbols.
|
||||
The linker will create the file @var{file} which will contain an
|
||||
import lib corresponding to the DLL the linker is generating. This
|
||||
import lib (which should be called @code{*.dll.a} or @code{*.a}
|
||||
may be used to link clients against the generated DLL; this behavior
|
||||
may be used to link clients against the generated DLL; this behaviour
|
||||
makes it possible to skip a separate @code{dlltool} import library
|
||||
creation step.
|
||||
[This option is specific to the i386 PE targeted port of the linker]
|
||||
@ -1897,7 +1943,7 @@ default.
|
||||
@item --dll-search-prefix @var{string}
|
||||
When linking dynamically to a dll without an import library,
|
||||
search for @code{<string><basename>.dll} in preference to
|
||||
@code{lib<basename>.dll}. This behavior allows easy distinction
|
||||
@code{lib<basename>.dll}. This behaviour allows easy distinction
|
||||
between DLLs built for the various "subplatforms": native, cygwin,
|
||||
uwin, pw, etc. For instance, cygwin DLLs typically use
|
||||
@code{--dll-search-prefix=cyg}.
|
||||
@ -1928,7 +1974,7 @@ data type of the exported variable:
|
||||
|
||||
One way is to use --enable-runtime-pseudo-reloc switch. This leaves the task
|
||||
of adjusting references in your client code for runtime environment, so
|
||||
this method works only when runtime environtment supports this feature.
|
||||
this method works only when runtime environment supports this feature.
|
||||
|
||||
A second solution is to force one of the 'constants' to be a variable --
|
||||
that is, unknown and un-optimizable at compile time. For arrays,
|
||||
@ -1968,7 +2014,7 @@ extern_ll -->
|
||||
|
||||
A third method of dealing with this difficulty is to abandon
|
||||
'auto-import' for the offending symbol and mark it with
|
||||
@code{__declspec(dllimport)}. However, in practice that
|
||||
@code{__declspec(dllimport)}. However, in practise that
|
||||
requires using compile-time #defines to indicate whether you are
|
||||
building a DLL, building client code that will link to the DLL, or
|
||||
merely building/linking to a static library. In making the choice
|
||||
@ -2025,7 +2071,7 @@ functions).
|
||||
|
||||
@kindex --disable-auto-import
|
||||
@item --disable-auto-import
|
||||
Do not attempt to do sophisticalted linking of @code{_symbol} to
|
||||
Do not attempt to do sophisticated linking of @code{_symbol} to
|
||||
@code{__imp__symbol} for DATA imports from DLLs.
|
||||
[This option is specific to the i386 PE targeted port of the linker]
|
||||
|
||||
@ -2083,7 +2129,7 @@ subsystem version also.
|
||||
|
||||
@c man begin ENVIRONMENT
|
||||
|
||||
You can change the behavior of @command{ld} with the environment variables
|
||||
You can change the behaviour of @command{ld} with the environment variables
|
||||
@ifclear SingleFormat
|
||||
@code{GNUTARGET},
|
||||
@end ifclear
|
||||
|
@ -289,8 +289,8 @@ main (int argc, char **argv)
|
||||
link_info.static_link = FALSE;
|
||||
link_info.traditional_format = FALSE;
|
||||
link_info.optimize = FALSE;
|
||||
link_info.no_undefined = FALSE;
|
||||
link_info.allow_shlib_undefined = TRUE;
|
||||
link_info.unresolved_syms_in_objects = RM_NOT_YET_SET;
|
||||
link_info.unresolved_syms_in_shared_libs = RM_NOT_YET_SET;
|
||||
link_info.allow_multiple_definition = FALSE;
|
||||
link_info.allow_undefined_version = TRUE;
|
||||
link_info.keep_memory = TRUE;
|
||||
|
246
ld/lexsup.c
246
ld/lexsup.c
@ -62,82 +62,87 @@ int parsing_defsym = 0;
|
||||
|
||||
/* Codes used for the long options with no short synonyms. 150 isn't
|
||||
special; it's just an arbitrary non-ASCII char value. */
|
||||
|
||||
#define OPTION_ASSERT 150
|
||||
#define OPTION_CALL_SHARED (OPTION_ASSERT + 1)
|
||||
#define OPTION_CREF (OPTION_CALL_SHARED + 1)
|
||||
#define OPTION_DEFSYM (OPTION_CREF + 1)
|
||||
#define OPTION_DEMANGLE (OPTION_DEFSYM + 1)
|
||||
#define OPTION_DYNAMIC_LINKER (OPTION_DEMANGLE + 1)
|
||||
#define OPTION_EB (OPTION_DYNAMIC_LINKER + 1)
|
||||
#define OPTION_EL (OPTION_EB + 1)
|
||||
#define OPTION_EMBEDDED_RELOCS (OPTION_EL + 1)
|
||||
#define OPTION_EXPORT_DYNAMIC (OPTION_EMBEDDED_RELOCS + 1)
|
||||
#define OPTION_HELP (OPTION_EXPORT_DYNAMIC + 1)
|
||||
#define OPTION_IGNORE (OPTION_HELP + 1)
|
||||
#define OPTION_MAP (OPTION_IGNORE + 1)
|
||||
#define OPTION_NO_DEMANGLE (OPTION_MAP + 1)
|
||||
#define OPTION_NO_KEEP_MEMORY (OPTION_NO_DEMANGLE + 1)
|
||||
#define OPTION_NO_WARN_MISMATCH (OPTION_NO_KEEP_MEMORY + 1)
|
||||
#define OPTION_NOINHIBIT_EXEC (OPTION_NO_WARN_MISMATCH + 1)
|
||||
#define OPTION_NON_SHARED (OPTION_NOINHIBIT_EXEC + 1)
|
||||
#define OPTION_NO_WHOLE_ARCHIVE (OPTION_NON_SHARED + 1)
|
||||
#define OPTION_OFORMAT (OPTION_NO_WHOLE_ARCHIVE + 1)
|
||||
#define OPTION_RELAX (OPTION_OFORMAT + 1)
|
||||
#define OPTION_RETAIN_SYMBOLS_FILE (OPTION_RELAX + 1)
|
||||
#define OPTION_RPATH (OPTION_RETAIN_SYMBOLS_FILE + 1)
|
||||
#define OPTION_RPATH_LINK (OPTION_RPATH + 1)
|
||||
#define OPTION_SHARED (OPTION_RPATH_LINK + 1)
|
||||
#define OPTION_SONAME (OPTION_SHARED + 1)
|
||||
#define OPTION_SORT_COMMON (OPTION_SONAME + 1)
|
||||
#define OPTION_STATS (OPTION_SORT_COMMON + 1)
|
||||
#define OPTION_SYMBOLIC (OPTION_STATS + 1)
|
||||
#define OPTION_TASK_LINK (OPTION_SYMBOLIC + 1)
|
||||
#define OPTION_TBSS (OPTION_TASK_LINK + 1)
|
||||
#define OPTION_TDATA (OPTION_TBSS + 1)
|
||||
#define OPTION_TTEXT (OPTION_TDATA + 1)
|
||||
#define OPTION_TRADITIONAL_FORMAT (OPTION_TTEXT + 1)
|
||||
#define OPTION_UR (OPTION_TRADITIONAL_FORMAT + 1)
|
||||
#define OPTION_VERBOSE (OPTION_UR + 1)
|
||||
#define OPTION_VERSION (OPTION_VERBOSE + 1)
|
||||
#define OPTION_VERSION_SCRIPT (OPTION_VERSION + 1)
|
||||
#define OPTION_VERSION_EXPORTS_SECTION (OPTION_VERSION_SCRIPT + 1)
|
||||
#define OPTION_WARN_COMMON (OPTION_VERSION_EXPORTS_SECTION + 1)
|
||||
#define OPTION_WARN_CONSTRUCTORS (OPTION_WARN_COMMON + 1)
|
||||
#define OPTION_WARN_FATAL (OPTION_WARN_CONSTRUCTORS + 1)
|
||||
#define OPTION_WARN_MULTIPLE_GP (OPTION_WARN_FATAL + 1)
|
||||
#define OPTION_WARN_ONCE (OPTION_WARN_MULTIPLE_GP + 1)
|
||||
#define OPTION_WARN_SECTION_ALIGN (OPTION_WARN_ONCE + 1)
|
||||
#define OPTION_SPLIT_BY_RELOC (OPTION_WARN_SECTION_ALIGN + 1)
|
||||
#define OPTION_SPLIT_BY_FILE (OPTION_SPLIT_BY_RELOC + 1)
|
||||
#define OPTION_WHOLE_ARCHIVE (OPTION_SPLIT_BY_FILE + 1)
|
||||
#define OPTION_WRAP (OPTION_WHOLE_ARCHIVE + 1)
|
||||
#define OPTION_FORCE_EXE_SUFFIX (OPTION_WRAP + 1)
|
||||
#define OPTION_GC_SECTIONS (OPTION_FORCE_EXE_SUFFIX + 1)
|
||||
#define OPTION_NO_GC_SECTIONS (OPTION_GC_SECTIONS + 1)
|
||||
#define OPTION_CHECK_SECTIONS (OPTION_NO_GC_SECTIONS + 1)
|
||||
#define OPTION_NO_CHECK_SECTIONS (OPTION_CHECK_SECTIONS + 1)
|
||||
#define OPTION_MPC860C0 (OPTION_NO_CHECK_SECTIONS + 1)
|
||||
#define OPTION_NO_UNDEFINED (OPTION_MPC860C0 + 1)
|
||||
#define OPTION_INIT (OPTION_NO_UNDEFINED + 1)
|
||||
#define OPTION_FINI (OPTION_INIT + 1)
|
||||
#define OPTION_SECTION_START (OPTION_FINI + 1)
|
||||
#define OPTION_UNIQUE (OPTION_SECTION_START + 1)
|
||||
#define OPTION_TARGET_HELP (OPTION_UNIQUE + 1)
|
||||
#define OPTION_ALLOW_SHLIB_UNDEFINED (OPTION_TARGET_HELP + 1)
|
||||
#define OPTION_NO_ALLOW_SHLIB_UNDEFINED (OPTION_ALLOW_SHLIB_UNDEFINED + 1)
|
||||
#define OPTION_ALLOW_MULTIPLE_DEFINITION (OPTION_NO_ALLOW_SHLIB_UNDEFINED + 1)
|
||||
#define OPTION_NO_UNDEFINED_VERSION (OPTION_ALLOW_MULTIPLE_DEFINITION + 1)
|
||||
#define OPTION_DISCARD_NONE (OPTION_NO_UNDEFINED_VERSION + 1)
|
||||
#define OPTION_SPARE_DYNAMIC_TAGS (OPTION_DISCARD_NONE + 1)
|
||||
#define OPTION_NO_DEFINE_COMMON (OPTION_SPARE_DYNAMIC_TAGS + 1)
|
||||
#define OPTION_NOSTDLIB (OPTION_NO_DEFINE_COMMON + 1)
|
||||
#define OPTION_NO_OMAGIC (OPTION_NOSTDLIB + 1)
|
||||
#define OPTION_STRIP_DISCARDED (OPTION_NO_OMAGIC + 1)
|
||||
#define OPTION_NO_STRIP_DISCARDED (OPTION_STRIP_DISCARDED + 1)
|
||||
#define OPTION_ACCEPT_UNKNOWN_INPUT_ARCH (OPTION_NO_STRIP_DISCARDED + 1)
|
||||
#define OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH (OPTION_ACCEPT_UNKNOWN_INPUT_ARCH + 1)
|
||||
#define OPTION_PIE (OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH + 1)
|
||||
enum option_values
|
||||
{
|
||||
OPTION_ASSERT = 150,
|
||||
OPTION_CALL_SHARED,
|
||||
OPTION_CREF,
|
||||
OPTION_DEFSYM,
|
||||
OPTION_DEMANGLE,
|
||||
OPTION_DYNAMIC_LINKER,
|
||||
OPTION_EB,
|
||||
OPTION_EL,
|
||||
OPTION_EMBEDDED_RELOCS,
|
||||
OPTION_EXPORT_DYNAMIC,
|
||||
OPTION_HELP,
|
||||
OPTION_IGNORE,
|
||||
OPTION_MAP,
|
||||
OPTION_NO_DEMANGLE,
|
||||
OPTION_NO_KEEP_MEMORY,
|
||||
OPTION_NO_WARN_MISMATCH,
|
||||
OPTION_NOINHIBIT_EXEC,
|
||||
OPTION_NON_SHARED,
|
||||
OPTION_NO_WHOLE_ARCHIVE,
|
||||
OPTION_OFORMAT,
|
||||
OPTION_RELAX,
|
||||
OPTION_RETAIN_SYMBOLS_FILE,
|
||||
OPTION_RPATH,
|
||||
OPTION_RPATH_LINK,
|
||||
OPTION_SHARED,
|
||||
OPTION_SONAME,
|
||||
OPTION_SORT_COMMON,
|
||||
OPTION_STATS,
|
||||
OPTION_SYMBOLIC,
|
||||
OPTION_TASK_LINK,
|
||||
OPTION_TBSS,
|
||||
OPTION_TDATA,
|
||||
OPTION_TTEXT,
|
||||
OPTION_TRADITIONAL_FORMAT,
|
||||
OPTION_UR,
|
||||
OPTION_VERBOSE,
|
||||
OPTION_VERSION,
|
||||
OPTION_VERSION_SCRIPT,
|
||||
OPTION_VERSION_EXPORTS_SECTION,
|
||||
OPTION_WARN_COMMON,
|
||||
OPTION_WARN_CONSTRUCTORS,
|
||||
OPTION_WARN_FATAL,
|
||||
OPTION_WARN_MULTIPLE_GP,
|
||||
OPTION_WARN_ONCE,
|
||||
OPTION_WARN_SECTION_ALIGN,
|
||||
OPTION_SPLIT_BY_RELOC,
|
||||
OPTION_SPLIT_BY_FILE ,
|
||||
OPTION_WHOLE_ARCHIVE,
|
||||
OPTION_WRAP,
|
||||
OPTION_FORCE_EXE_SUFFIX,
|
||||
OPTION_GC_SECTIONS,
|
||||
OPTION_NO_GC_SECTIONS,
|
||||
OPTION_CHECK_SECTIONS,
|
||||
OPTION_NO_CHECK_SECTIONS,
|
||||
OPTION_MPC860C0,
|
||||
OPTION_NO_UNDEFINED,
|
||||
OPTION_INIT,
|
||||
OPTION_FINI,
|
||||
OPTION_SECTION_START,
|
||||
OPTION_UNIQUE,
|
||||
OPTION_TARGET_HELP,
|
||||
OPTION_ALLOW_SHLIB_UNDEFINED,
|
||||
OPTION_NO_ALLOW_SHLIB_UNDEFINED,
|
||||
OPTION_ALLOW_MULTIPLE_DEFINITION,
|
||||
OPTION_NO_UNDEFINED_VERSION,
|
||||
OPTION_DISCARD_NONE,
|
||||
OPTION_SPARE_DYNAMIC_TAGS,
|
||||
OPTION_NO_DEFINE_COMMON,
|
||||
OPTION_NOSTDLIB,
|
||||
OPTION_NO_OMAGIC,
|
||||
OPTION_STRIP_DISCARDED,
|
||||
OPTION_NO_STRIP_DISCARDED,
|
||||
OPTION_ACCEPT_UNKNOWN_INPUT_ARCH,
|
||||
OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH,
|
||||
OPTION_PIE,
|
||||
OPTION_UNRESOLVED_SYMBOLS,
|
||||
OPTION_WARN_UNRESOLVED_SYMBOLS,
|
||||
OPTION_ERROR_UNRESOLVED_SYMBOLS
|
||||
};
|
||||
|
||||
/* The long options. This structure is used for both the option
|
||||
parsing and the help text. */
|
||||
@ -334,11 +339,11 @@ static const struct ld_option ld_options[] =
|
||||
{ {"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY},
|
||||
'\0', NULL, N_("Use less memory and more disk I/O"), TWO_DASHES },
|
||||
{ {"no-undefined", no_argument, NULL, OPTION_NO_UNDEFINED},
|
||||
'\0', NULL, N_("Allow no undefined symbols"), TWO_DASHES },
|
||||
'\0', NULL, N_("Do not allow unresolved references in object files"), TWO_DASHES },
|
||||
{ {"allow-shlib-undefined", no_argument, NULL, OPTION_ALLOW_SHLIB_UNDEFINED},
|
||||
'\0', NULL, N_("Allow undefined symbols in shared objects (the default)"), TWO_DASHES },
|
||||
'\0', NULL, N_("Allow unresolved references in shared libaries"), TWO_DASHES },
|
||||
{ {"no-allow-shlib-undefined", no_argument, NULL, OPTION_NO_ALLOW_SHLIB_UNDEFINED},
|
||||
'\0', NULL, N_("Do not allow undefined symbols in shared objects"), TWO_DASHES },
|
||||
'\0', NULL, N_("Do not allow unresolved references in shared libs"), TWO_DASHES },
|
||||
{ {"allow-multiple-definition", no_argument, NULL, OPTION_ALLOW_MULTIPLE_DEFINITION},
|
||||
'\0', NULL, N_("Allow multiple definitions"), TWO_DASHES },
|
||||
{ {"no-undefined-version", no_argument, NULL, OPTION_NO_UNDEFINED_VERSION},
|
||||
@ -400,6 +405,9 @@ static const struct ld_option ld_options[] =
|
||||
'\0', N_("ADDRESS"), N_("Set address of .data section"), ONE_DASH },
|
||||
{ {"Ttext", required_argument, NULL, OPTION_TTEXT},
|
||||
'\0', N_("ADDRESS"), N_("Set address of .text section"), ONE_DASH },
|
||||
{ {"unresolved-symbols=<method>", required_argument, NULL, OPTION_UNRESOLVED_SYMBOLS},
|
||||
'\0', NULL, N_("How to handle unresolved symbols. <method> is:\n\t\t\t\tignore-all, report-all, ignore-in-object-files,\n\t\t\t\tignore-in-shared-libs"),
|
||||
TWO_DASHES },
|
||||
{ {"verbose", no_argument, NULL, OPTION_VERBOSE},
|
||||
'\0', NULL, N_("Output lots of information during link"), TWO_DASHES },
|
||||
{ {"dll-verbose", no_argument, NULL, OPTION_VERBOSE}, /* Linux. */
|
||||
@ -422,6 +430,10 @@ static const struct ld_option ld_options[] =
|
||||
{ {"warn-section-align", no_argument, NULL, OPTION_WARN_SECTION_ALIGN},
|
||||
'\0', NULL, N_("Warn if start of section changes due to alignment"),
|
||||
TWO_DASHES },
|
||||
{ {"warn-unresolved-symbols", no_argument, NULL, OPTION_WARN_UNRESOLVED_SYMBOLS},
|
||||
'\0', NULL, N_("Report unresolved symbols as warnings"), TWO_DASHES },
|
||||
{ {"error-unresolved-symbols", no_argument, NULL, OPTION_ERROR_UNRESOLVED_SYMBOLS},
|
||||
'\0', NULL, N_("Report unresolved symbols as errors"), TWO_DASHES },
|
||||
{ {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL},
|
||||
'\0', NULL, N_("Treat warnings as errors"),
|
||||
TWO_DASHES },
|
||||
@ -469,6 +481,7 @@ parse_args (unsigned argc, char **argv)
|
||||
struct option *longopts;
|
||||
struct option *really_longopts;
|
||||
int last_optind;
|
||||
enum report_method how_to_report_unresolved_symbols = RM_GENERATE_ERROR;
|
||||
|
||||
shortopts = xmalloc (OPTION_COUNT * 3 + 2);
|
||||
longopts = xmalloc (sizeof (*longopts) * (OPTION_COUNT + 1));
|
||||
@ -647,9 +660,21 @@ parse_args (unsigned argc, char **argv)
|
||||
break;
|
||||
case OPTION_CALL_SHARED:
|
||||
config.dynamic_link = TRUE;
|
||||
/* When linking against shared libraries, the default
|
||||
behaviour is to ignore any unresolved references. */
|
||||
if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
|
||||
link_info.unresolved_syms_in_objects = RM_IGNORE;
|
||||
if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
|
||||
link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
|
||||
break;
|
||||
case OPTION_NON_SHARED:
|
||||
config.dynamic_link = FALSE;
|
||||
/* When linking against static libraries, the default
|
||||
behaviour is to report any unresolved references. */
|
||||
if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
|
||||
link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
|
||||
if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
|
||||
link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
|
||||
break;
|
||||
case OPTION_CREF:
|
||||
command_line.cref = TRUE;
|
||||
@ -790,14 +815,53 @@ parse_args (unsigned argc, char **argv)
|
||||
link_info.keep_memory = FALSE;
|
||||
break;
|
||||
case OPTION_NO_UNDEFINED:
|
||||
link_info.no_undefined = TRUE;
|
||||
link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
|
||||
break;
|
||||
case OPTION_ALLOW_SHLIB_UNDEFINED:
|
||||
link_info.allow_shlib_undefined = TRUE;
|
||||
link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
|
||||
break;
|
||||
case OPTION_NO_ALLOW_SHLIB_UNDEFINED:
|
||||
link_info.allow_shlib_undefined = FALSE;
|
||||
link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
|
||||
break;
|
||||
case OPTION_UNRESOLVED_SYMBOLS:
|
||||
if (strcmp (optarg, "ignore-all") == 0)
|
||||
{
|
||||
link_info.unresolved_syms_in_objects = RM_IGNORE;
|
||||
link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
|
||||
}
|
||||
else if (strcmp (optarg, "report-all") == 0)
|
||||
{
|
||||
link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
|
||||
link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
|
||||
}
|
||||
else if (strcmp (optarg, "ignore-in-object-files") == 0)
|
||||
{
|
||||
link_info.unresolved_syms_in_objects = RM_IGNORE;
|
||||
link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
|
||||
}
|
||||
else if (strcmp (optarg, "ignore-in-shared-libs") == 0)
|
||||
{
|
||||
link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
|
||||
link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
|
||||
}
|
||||
else
|
||||
einfo (_("%P%F: bad --unresolved-symbols option: %s\n"), optarg);
|
||||
break;
|
||||
case OPTION_WARN_UNRESOLVED_SYMBOLS:
|
||||
how_to_report_unresolved_symbols = RM_GENERATE_WARNING;
|
||||
if (link_info.unresolved_syms_in_objects == RM_GENERATE_ERROR)
|
||||
link_info.unresolved_syms_in_objects = RM_GENERATE_WARNING;
|
||||
if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
|
||||
link_info.unresolved_syms_in_shared_libs = RM_GENERATE_WARNING;
|
||||
break;
|
||||
|
||||
case OPTION_ERROR_UNRESOLVED_SYMBOLS:
|
||||
how_to_report_unresolved_symbols = RM_GENERATE_ERROR;
|
||||
if (link_info.unresolved_syms_in_objects == RM_GENERATE_WARNING)
|
||||
link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
|
||||
if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_WARNING)
|
||||
link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
|
||||
break;
|
||||
case OPTION_ALLOW_MULTIPLE_DEFINITION:
|
||||
link_info.allow_multiple_definition = TRUE;
|
||||
break;
|
||||
@ -948,7 +1012,15 @@ parse_args (unsigned argc, char **argv)
|
||||
break;
|
||||
case OPTION_SHARED:
|
||||
if (config.has_shared)
|
||||
link_info.shared = TRUE;
|
||||
{
|
||||
link_info.shared = TRUE;
|
||||
/* When creating a shared library, the default
|
||||
behaviour is to ignore any unresolved references. */
|
||||
if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
|
||||
link_info.unresolved_syms_in_objects = RM_IGNORE;
|
||||
if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
|
||||
link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
|
||||
}
|
||||
else
|
||||
einfo (_("%P%F: -shared not supported\n"));
|
||||
break;
|
||||
@ -1202,6 +1274,14 @@ parse_args (unsigned argc, char **argv)
|
||||
set_default_dirlist (default_dirlist);
|
||||
free (default_dirlist);
|
||||
}
|
||||
|
||||
if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
|
||||
/* FIXME: Should we allow emulations a chance to set this ? */
|
||||
link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
|
||||
|
||||
if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
|
||||
/* FIXME: Should we allow emulations a chance to set this ? */
|
||||
link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
|
||||
}
|
||||
|
||||
/* Add the (colon-separated) elements of DIRLIST_PTR to the
|
||||
|
Loading…
Reference in New Issue
Block a user