| /* BFD back-end for Apple M68K COFF A/UX 3.x files. |
| Copyright (C) 1996-2016 Free Software Foundation, Inc. |
| Written by Richard Henderson <rth@tamu.edu>. |
| |
| This file is part of BFD, the Binary File Descriptor library. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
| MA 02110-1301, USA. */ |
| |
| #define TARGET_SYM m68k_coff_aux_vec |
| #define TARGET_NAME "coff-m68k-aux" |
| |
| #ifndef TARG_AUX |
| #define TARG_AUX |
| #endif |
| |
| #define COFF_LONG_FILENAMES |
| |
| /* 4k pages */ |
| #define COFF_PAGE_SIZE 0x1000 |
| |
| /* On AUX, a STYP_NOLOAD|STYP_BSS section is part of a shared library. */ |
| #define BSS_NOLOAD_IS_SHARED_LIBRARY |
| |
| #define STATIC_RELOCS |
| |
| #define COFF_COMMON_ADDEND |
| |
| #include "sysdep.h" |
| #include "bfd.h" |
| |
| #define coff_link_add_one_symbol coff_m68k_aux_link_add_one_symbol |
| static bfd_boolean |
| coff_m68k_aux_link_add_one_symbol |
| (struct bfd_link_info *, bfd *, const char *, flagword, asection *, |
| bfd_vma, const char *, bfd_boolean, bfd_boolean, |
| struct bfd_link_hash_entry **); |
| |
| #ifndef bfd_pe_print_pdata |
| #define bfd_pe_print_pdata NULL |
| #endif |
| |
| #include "coff/aux-coff.h" /* override coff/internal.h and coff/m68k.h */ |
| #include "coff-m68k.c" |
| |
| /* We need non-absolute symbols to override absolute symbols. This |
| mirrors Apple's "solution" to let a static library symbol override |
| a shared library symbol. On the whole not a good thing, given how |
| shared libraries work here, but can work if you are careful with |
| what you include in the shared object. */ |
| |
| static bfd_boolean |
| coff_m68k_aux_link_add_one_symbol (struct bfd_link_info *info, |
| bfd *abfd, |
| const char *name, |
| flagword flags, |
| asection *section, |
| bfd_vma value, |
| const char *string, |
| bfd_boolean copy, |
| bfd_boolean collect, |
| struct bfd_link_hash_entry **hashp) |
| { |
| struct bfd_link_hash_entry *h, *inh, *t; |
| |
| if ((flags & (BSF_WARNING | BSF_CONSTRUCTOR | BSF_WEAK)) == 0 |
| && !bfd_is_und_section (section) |
| && !bfd_is_com_section (section)) |
| { |
| /* The new symbol is a definition or an indirect definition */ |
| |
| /* This bit copied from linker.c */ |
| if (hashp != NULL && *hashp != NULL) |
| h = *hashp; |
| else |
| { |
| h = bfd_link_hash_lookup (info->hash, name, TRUE, copy, FALSE); |
| if (h == NULL) |
| { |
| if (hashp != NULL) |
| *hashp = NULL; |
| return FALSE; |
| } |
| } |
| |
| if (hashp != (struct bfd_link_hash_entry **) NULL) |
| *hashp = h; |
| /* end duplication from linker.c */ |
| |
| t = h; |
| inh = NULL; |
| if (h->type == bfd_link_hash_indirect) |
| { |
| inh = h->u.i.link; |
| t = inh; |
| } |
| |
| if (t->type == bfd_link_hash_defined) |
| { |
| asection *msec = t->u.def.section; |
| bfd_boolean special = FALSE; |
| |
| if (bfd_is_abs_section (msec) && !bfd_is_abs_section (section)) |
| { |
| t->u.def.section = section; |
| t->u.def.value = value; |
| special = TRUE; |
| } |
| else if (bfd_is_abs_section (section) && !bfd_is_abs_section (msec)) |
| special = TRUE; |
| |
| if (special) |
| { |
| if (info->notice_all |
| || (info->notice_hash != NULL |
| && bfd_hash_lookup (info->notice_hash, name, |
| FALSE, FALSE) != NULL)) |
| { |
| if (!(*info->callbacks->notice) (info, h, inh, |
| abfd, section, value, flags)) |
| return FALSE; |
| } |
| |
| return TRUE; |
| } |
| } |
| } |
| |
| /* If we didn't exit early, finish processing in the generic routine */ |
| return _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, |
| value, string, copy, collect, |
| hashp); |
| } |