From 8853c3d3367a798e577c1a986f587291f46e71f1 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 21 Mar 2005 12:24:10 +0000 Subject: [PATCH] * elf32-ppc.c (is_ppc_elf_target): Move to linker part of file. (ppc_elf_merge_private_bfd_data): Likewise. --- bfd/ChangeLog | 7 +- bfd/elf32-ppc.c | 206 ++++++++++++++++++++++++------------------------ 2 files changed, 109 insertions(+), 104 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 93587fe5eb..fb5ddf9e9d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2005-03-21 Alan Modra + + * elf32-ppc.c (is_ppc_elf_target): Move to linker part of file. + (ppc_elf_merge_private_bfd_data): Likewise. + 2005-03-21 Alan Modra * elf32-ppc.c (struct elf_linker_section): Remove rel_section. @@ -62,7 +67,7 @@ 2005-03-18 C Jaiprakash - * elf32-m68k.c (elf_cfv4e_plt0_entry): plt entry for coldfire v4e. + * elf32-m68k.c (elf_cfv4e_plt0_entry): plt entry for coldfire v4e. (elf_m68k_adjust_dynamic_symbol,elf_m68k_finish_dynamic_symbol, elf_m68k_finish_dynamic_sections): Use it. diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 260378c3b2..40507599da 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -1592,109 +1592,6 @@ ppc_elf_set_private_flags (bfd *abfd, flagword flags) return TRUE; } -/* Return 1 if target is one of ours. */ - -static bfd_boolean -is_ppc_elf_target (const struct bfd_target *targ) -{ - extern const bfd_target bfd_elf32_powerpc_vec; - extern const bfd_target bfd_elf32_powerpcle_vec; - - return targ == &bfd_elf32_powerpc_vec || targ == &bfd_elf32_powerpcle_vec; -} - -/* Merge backend specific data from an object file to the output - object file when linking. */ - -static bfd_boolean -ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd) -{ - flagword old_flags; - flagword new_flags; - bfd_boolean error; - - if (!is_ppc_elf_target (ibfd->xvec) - || !is_ppc_elf_target (obfd->xvec)) - return TRUE; - - /* Check if we have the same endianess. */ - if (! _bfd_generic_verify_endian_match (ibfd, obfd)) - return FALSE; - - new_flags = elf_elfheader (ibfd)->e_flags; - old_flags = elf_elfheader (obfd)->e_flags; - if (!elf_flags_init (obfd)) - { - /* First call, no flags set. */ - elf_flags_init (obfd) = TRUE; - elf_elfheader (obfd)->e_flags = new_flags; - } - - /* Compatible flags are ok. */ - else if (new_flags == old_flags) - ; - - /* Incompatible flags. */ - else - { - /* Warn about -mrelocatable mismatch. Allow -mrelocatable-lib - to be linked with either. */ - error = FALSE; - if ((new_flags & EF_PPC_RELOCATABLE) != 0 - && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0) - { - error = TRUE; - (*_bfd_error_handler) - (_("%B: compiled with -mrelocatable and linked with " - "modules compiled normally"), ibfd); - } - else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0 - && (old_flags & EF_PPC_RELOCATABLE) != 0) - { - error = TRUE; - (*_bfd_error_handler) - (_("%B: compiled normally and linked with " - "modules compiled with -mrelocatable"), ibfd); - } - - /* The output is -mrelocatable-lib iff both the input files are. */ - if (! (new_flags & EF_PPC_RELOCATABLE_LIB)) - elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB; - - /* The output is -mrelocatable iff it can't be -mrelocatable-lib, - but each input file is either -mrelocatable or -mrelocatable-lib. */ - if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB) - && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)) - && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))) - elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE; - - /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if - any module uses it. */ - elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB); - - new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB); - old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB); - - /* Warn about any other mismatches. */ - if (new_flags != old_flags) - { - error = TRUE; - (*_bfd_error_handler) - (_("%B: uses different e_flags (0x%lx) fields " - "than previous modules (0x%lx)"), - ibfd, (long) new_flags, (long) old_flags); - } - - if (error) - { - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - } - - return TRUE; -} - /* Support for core dump NOTE sections. */ static bfd_boolean @@ -2438,6 +2335,17 @@ ppc_elf_copy_indirect_symbol (const struct elf_backend_data *bed, _bfd_elf_link_hash_copy_indirect (bed, dir, ind); } +/* Return 1 if target is one of ours. */ + +static bfd_boolean +is_ppc_elf_target (const struct bfd_target *targ) +{ + extern const bfd_target bfd_elf32_powerpc_vec; + extern const bfd_target bfd_elf32_powerpcle_vec; + + return targ == &bfd_elf32_powerpc_vec || targ == &bfd_elf32_powerpcle_vec; +} + /* Hook called by the linker routine which adds symbols from an object file. We use it to put .comm items in .sbss, and not .bss. */ @@ -3186,6 +3094,98 @@ ppc_elf_check_relocs (bfd *abfd, return TRUE; } +/* Merge backend specific data from an object file to the output + object file when linking. */ + +static bfd_boolean +ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd) +{ + flagword old_flags; + flagword new_flags; + bfd_boolean error; + + if (!is_ppc_elf_target (ibfd->xvec) + || !is_ppc_elf_target (obfd->xvec)) + return TRUE; + + /* Check if we have the same endianess. */ + if (! _bfd_generic_verify_endian_match (ibfd, obfd)) + return FALSE; + + new_flags = elf_elfheader (ibfd)->e_flags; + old_flags = elf_elfheader (obfd)->e_flags; + if (!elf_flags_init (obfd)) + { + /* First call, no flags set. */ + elf_flags_init (obfd) = TRUE; + elf_elfheader (obfd)->e_flags = new_flags; + } + + /* Compatible flags are ok. */ + else if (new_flags == old_flags) + ; + + /* Incompatible flags. */ + else + { + /* Warn about -mrelocatable mismatch. Allow -mrelocatable-lib + to be linked with either. */ + error = FALSE; + if ((new_flags & EF_PPC_RELOCATABLE) != 0 + && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0) + { + error = TRUE; + (*_bfd_error_handler) + (_("%B: compiled with -mrelocatable and linked with " + "modules compiled normally"), ibfd); + } + else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0 + && (old_flags & EF_PPC_RELOCATABLE) != 0) + { + error = TRUE; + (*_bfd_error_handler) + (_("%B: compiled normally and linked with " + "modules compiled with -mrelocatable"), ibfd); + } + + /* The output is -mrelocatable-lib iff both the input files are. */ + if (! (new_flags & EF_PPC_RELOCATABLE_LIB)) + elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB; + + /* The output is -mrelocatable iff it can't be -mrelocatable-lib, + but each input file is either -mrelocatable or -mrelocatable-lib. */ + if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB) + && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)) + && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))) + elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE; + + /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if + any module uses it. */ + elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB); + + new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB); + old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB); + + /* Warn about any other mismatches. */ + if (new_flags != old_flags) + { + error = TRUE; + (*_bfd_error_handler) + (_("%B: uses different e_flags (0x%lx) fields " + "than previous modules (0x%lx)"), + ibfd, (long) new_flags, (long) old_flags); + } + + if (error) + { + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + } + + return TRUE; +} + /* Return the section that should be marked against GC for a given relocation. */