aout-arm.c revision 77298
160484Sobrien/* BFD back-end for raw ARM a.out binaries. 260484Sobrien Copyright (C) 1994, 95, 96, 97, 98, 1999 Free Software Foundation, Inc. 360484Sobrien Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) 477298Sobrien 560484SobrienThis file is part of BFD, the Binary File Descriptor library. 660484Sobrien 760484SobrienThis program is free software; you can redistribute it and/or modify 860484Sobrienit under the terms of the GNU General Public License as published by 960484Sobrienthe Free Software Foundation; either version 2 of the License, or 1060484Sobrien(at your option) any later version. 1160484Sobrien 1260484SobrienThis program is distributed in the hope that it will be useful, 1360484Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of 1460484SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1560484SobrienGNU General Public License for more details. 1660484Sobrien 1760484SobrienYou should have received a copy of the GNU General Public License 1860484Sobrienalong with this program; if not, write to the Free Software 1960484SobrienFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 2060484Sobrien 2160484Sobrien#define N_TXTADDR(x) \ 2260484Sobrien ((N_MAGIC(x) == NMAGIC) ? 0x8000 : \ 2360484Sobrien (N_MAGIC(x) != ZMAGIC) ? 0 : \ 2460484Sobrien (N_SHARED_LIB(x)) ? ((x).a_entry & ~(TARGET_PAGE_SIZE - 1)) : \ 2560484Sobrien TEXT_START_ADDR) 2660484Sobrien 2760484Sobrien#define TEXT_START_ADDR 0x8000 2860484Sobrien#define TARGET_PAGE_SIZE 0x8000 2960484Sobrien#define SEGMENT_SIZE TARGET_PAGE_SIZE 3060484Sobrien#define DEFAULT_ARCH bfd_arch_arm 3160484Sobrien 3260484Sobrien#define MY(OP) CAT(aoutarm_,OP) 3360484Sobrien#define N_BADMAG(x) ((((x).a_info & ~007200) != ZMAGIC) && \ 3460484Sobrien (((x).a_info & ~006000) != OMAGIC) && \ 3560484Sobrien ((x).a_info != NMAGIC)) 3660484Sobrien#define N_MAGIC(x) ((x).a_info & ~07200) 3760484Sobrien 3860484Sobrien#include "bfd.h" 3960484Sobrien#include "sysdep.h" 4060484Sobrien 4160484Sobrien#define MYARM(OP) CAT(aoutarm_,OP) 4260484Sobrienreloc_howto_type *MYARM(bfd_reloc_type_lookup) 4360484Sobrien PARAMS((bfd *, bfd_reloc_code_real_type)); 4460484Sobrienstatic boolean MYARM(write_object_contents) PARAMS((bfd *)); 4560484Sobrien 4677298Sobrien/* Avoid multiple defininitions from aoutx if supporting standarad a.out 4760484Sobrien as well as our own. */ 4860484Sobrien#define NAME(x,y) CAT3(aoutarm,_32_,y) 4960484Sobrien 5060484Sobrien#define MY_bfd_reloc_type_lookup aoutarm_bfd_reloc_type_lookup 5160484Sobrien 5260484Sobrien#include "libaout.h" 5360484Sobrien#include "aout/aout64.h" 5460484Sobrien 5560484Sobrienstatic bfd_reloc_status_type 5660484SobrienMY(fix_pcrel_26_done) PARAMS ((bfd *, arelent *, asymbol *, PTR, 5760484Sobrien asection *, bfd *, char **)); 5860484Sobrien 5960484Sobrienstatic bfd_reloc_status_type 6060484SobrienMY(fix_pcrel_26) PARAMS ((bfd *, arelent *, asymbol *, PTR, 6160484Sobrien asection *, bfd *, char **)); 6260484Sobrienstatic void MY(swap_std_reloc_in) PARAMS ((bfd *, struct reloc_std_external *, 6360484Sobrien arelent *, asymbol **, 6460484Sobrien bfd_size_type)); 6577298Sobrienvoid MY(swap_std_reloc_out) PARAMS ((bfd *, arelent *, 6660484Sobrien struct reloc_std_external *)); 6760484Sobrien 6860484Sobrienreloc_howto_type MY(howto_table)[] = 6960484Sobrien{ 7060484Sobrien /* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask 7160484Sobrien pcdone */ 7260484Sobrien HOWTO (0, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "8", true, 7360484Sobrien 0x000000ff, 0x000000ff, false), 7460484Sobrien HOWTO (1, 0, 1, 16, false, 0, complain_overflow_bitfield, 0, "16", true, 7560484Sobrien 0x0000ffff, 0x0000ffff, false), 7660484Sobrien HOWTO (2, 0, 2, 32, false, 0, complain_overflow_bitfield, 0, "32", true, 7760484Sobrien 0xffffffff, 0xffffffff, false), 7860484Sobrien HOWTO (3, 2, 2, 26, true, 0, complain_overflow_signed, MY(fix_pcrel_26), 7960484Sobrien "ARM26", true, 0x00ffffff, 0x00ffffff, true), 8060484Sobrien HOWTO (4, 0, 0, 8, true, 0, complain_overflow_signed, 0, "DISP8", true, 8160484Sobrien 0x000000ff, 0x000000ff, true), 8260484Sobrien HOWTO (5, 0, 1, 16, true, 0, complain_overflow_signed, 0, "DISP16", true, 8360484Sobrien 0x0000ffff, 0x0000ffff, true), 8460484Sobrien HOWTO (6, 0, 2, 32, true, 0, complain_overflow_signed, 0, "DISP32", true, 8560484Sobrien 0xffffffff, 0xffffffff, true), 8660484Sobrien HOWTO (7, 2, 2, 26, false, 0, complain_overflow_signed, 8760484Sobrien MY(fix_pcrel_26_done), "ARM26D", true, 0x0, 0x0, 8860484Sobrien false), 8960484Sobrien EMPTY_HOWTO (-1), 9060484Sobrien HOWTO (9, 0, -1, 16, false, 0, complain_overflow_bitfield, 0, "NEG16", true, 9160484Sobrien 0x0000ffff, 0x0000ffff, false), 9260484Sobrien HOWTO (10, 0, -2, 32, false, 0, complain_overflow_bitfield, 0, "NEG32", true, 9360484Sobrien 0xffffffff, 0xffffffff, false) 9460484Sobrien}; 9560484Sobrien 9660484Sobrien#define RELOC_ARM_BITS_NEG_BIG ((unsigned int) 0x08) 9760484Sobrien#define RELOC_ARM_BITS_NEG_LITTLE ((unsigned int) 0x10) 9860484Sobrien 9960484Sobrienreloc_howto_type * 10077298SobrienMY(reloc_howto) (abfd, rel, r_index, r_extern, r_pcrel) 10160484Sobrien bfd *abfd; 10260484Sobrien struct reloc_std_external *rel; 10360484Sobrien int *r_index; 10460484Sobrien int *r_extern; 10560484Sobrien int *r_pcrel; 10660484Sobrien{ 10760484Sobrien unsigned int r_length; 10860484Sobrien unsigned int r_pcrel_done; 10960484Sobrien unsigned int r_neg; 11060484Sobrien int index; 11160484Sobrien 11260484Sobrien *r_pcrel = 0; 11360484Sobrien if (bfd_header_big_endian (abfd)) 11460484Sobrien { 11560484Sobrien *r_index = ((rel->r_index[0] << 16) 11660484Sobrien | (rel->r_index[1] << 8) 11760484Sobrien | rel->r_index[2]); 11860484Sobrien *r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG)); 11960484Sobrien r_pcrel_done = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_BIG)); 12060484Sobrien r_neg = (0 != (rel->r_type[0] & RELOC_ARM_BITS_NEG_BIG)); 12160484Sobrien r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_BIG) 12260484Sobrien >> RELOC_STD_BITS_LENGTH_SH_BIG); 12360484Sobrien } 12460484Sobrien else 12560484Sobrien { 12660484Sobrien *r_index = ((rel->r_index[2] << 16) 12760484Sobrien | (rel->r_index[1] << 8) 12860484Sobrien | rel->r_index[0]); 12960484Sobrien *r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE)); 13060484Sobrien r_pcrel_done = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE)); 13160484Sobrien r_neg = (0 != (rel->r_type[0] & RELOC_ARM_BITS_NEG_LITTLE)); 13260484Sobrien r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE) 13360484Sobrien >> RELOC_STD_BITS_LENGTH_SH_LITTLE); 13460484Sobrien } 13560484Sobrien index = r_length + 4 * r_pcrel_done + 8 * r_neg; 13660484Sobrien if (index == 3) 13760484Sobrien *r_pcrel = 1; 13860484Sobrien 13960484Sobrien return MY(howto_table) + index; 14060484Sobrien} 14177298Sobrien 14260484Sobrien#define MY_reloc_howto(BFD, REL, IN, EX, PC) \ 14360484Sobrien MY(reloc_howto) (BFD, REL, &IN, &EX, &PC) 14460484Sobrien 14560484Sobrienvoid 14677298SobrienMY(put_reloc) (abfd, r_extern, r_index, value, howto, reloc) 14760484Sobrien bfd *abfd; 14860484Sobrien int r_extern; 14960484Sobrien int r_index; 15060484Sobrien long value; 15160484Sobrien reloc_howto_type *howto; 15260484Sobrien struct reloc_std_external *reloc; 15360484Sobrien{ 15460484Sobrien unsigned int r_length; 15560484Sobrien int r_pcrel; 15660484Sobrien int r_neg; 15760484Sobrien 15860484Sobrien PUT_WORD (abfd, value, reloc->r_address); 15960484Sobrien r_length = howto->size ; /* Size as a power of two */ 16060484Sobrien 16177298Sobrien /* Special case for branch relocations. */ 16260484Sobrien if (howto->type == 3 || howto->type == 7) 16360484Sobrien r_length = 3; 16460484Sobrien 16560484Sobrien r_pcrel = howto->type & 4; /* PC Relative done? */ 16660484Sobrien r_neg = howto->type & 8; /* Negative relocation */ 16760484Sobrien if (bfd_header_big_endian (abfd)) 16860484Sobrien { 16960484Sobrien reloc->r_index[0] = r_index >> 16; 17060484Sobrien reloc->r_index[1] = r_index >> 8; 17160484Sobrien reloc->r_index[2] = r_index; 17260484Sobrien reloc->r_type[0] = 17360484Sobrien ((r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0) 17460484Sobrien | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0) 17560484Sobrien | (r_neg ? RELOC_ARM_BITS_NEG_BIG : 0) 17660484Sobrien | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG)); 17760484Sobrien } 17860484Sobrien else 17960484Sobrien { 18060484Sobrien reloc->r_index[2] = r_index >> 16; 18160484Sobrien reloc->r_index[1] = r_index >> 8; 18260484Sobrien reloc->r_index[0] = r_index; 18360484Sobrien reloc->r_type[0] = 18460484Sobrien ((r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0) 18560484Sobrien | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0) 18660484Sobrien | (r_neg ? RELOC_ARM_BITS_NEG_LITTLE : 0) 18760484Sobrien | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE)); 18860484Sobrien } 18960484Sobrien} 19077298Sobrien 19160484Sobrien#define MY_put_reloc(BFD, EXT, IDX, VAL, HOWTO, RELOC) \ 19277298Sobrien MY(put_reloc) (BFD, EXT, IDX, VAL, HOWTO, RELOC) 19360484Sobrien 19460484Sobrienvoid 19577298SobrienMY(relocatable_reloc) (howto, abfd, reloc, amount, r_addr) 19660484Sobrien reloc_howto_type *howto; 19760484Sobrien bfd *abfd; 19860484Sobrien struct reloc_std_external *reloc; 19960484Sobrien bfd_vma *amount; 20060484Sobrien bfd_vma r_addr; 20160484Sobrien{ 20260484Sobrien if (howto->type == 3) 20360484Sobrien { 20477298Sobrien if (reloc->r_type[0] 20560484Sobrien & (bfd_header_big_endian (abfd) 20660484Sobrien ? RELOC_STD_BITS_EXTERN_BIG : RELOC_STD_BITS_EXTERN_LITTLE)) 20760484Sobrien { 20877298Sobrien /* The reloc is still external, so don't modify anything. */ 20960484Sobrien *amount = 0; 21060484Sobrien } 21160484Sobrien else 21260484Sobrien { 21360484Sobrien *amount -= r_addr; 21460484Sobrien /* Change the r_pcrel value -- on the ARM, this bit is set once the 21560484Sobrien relocation is done. */ 21660484Sobrien if (bfd_header_big_endian (abfd)) 21760484Sobrien reloc->r_type[0] |= RELOC_STD_BITS_PCREL_BIG; 21860484Sobrien else 21960484Sobrien reloc->r_type[0] |= RELOC_STD_BITS_PCREL_LITTLE; 22060484Sobrien } 22160484Sobrien } 22260484Sobrien else if (howto->type == 7) 22360484Sobrien *amount = 0; 22460484Sobrien} 22560484Sobrien 22660484Sobrien#define MY_relocatable_reloc(HOW, BFD, REL, AMOUNT, ADDR) \ 22777298Sobrien MY(relocatable_reloc) (HOW, BFD, REL, &(AMOUNT), ADDR) 22860484Sobrien 22960484Sobrienstatic bfd_reloc_status_type 23060484SobrienMY(fix_pcrel_26_done) (abfd, reloc_entry, symbol, data, input_section, 23160484Sobrien output_bfd, error_message) 23260484Sobrien bfd *abfd ATTRIBUTE_UNUSED; 23360484Sobrien arelent *reloc_entry ATTRIBUTE_UNUSED; 23460484Sobrien asymbol *symbol ATTRIBUTE_UNUSED; 23560484Sobrien PTR data ATTRIBUTE_UNUSED; 23660484Sobrien asection *input_section ATTRIBUTE_UNUSED; 23760484Sobrien bfd *output_bfd ATTRIBUTE_UNUSED; 23860484Sobrien char **error_message ATTRIBUTE_UNUSED; 23960484Sobrien{ 24060484Sobrien /* This is dead simple at present. */ 24160484Sobrien return bfd_reloc_ok; 24260484Sobrien} 24360484Sobrien 24460484Sobrienstatic bfd_reloc_status_type 24560484SobrienMY(fix_pcrel_26) (abfd, reloc_entry, symbol, data, input_section, 24660484Sobrien output_bfd, error_message) 24760484Sobrien bfd *abfd; 24860484Sobrien arelent *reloc_entry; 24960484Sobrien asymbol *symbol; 25060484Sobrien PTR data; 25160484Sobrien asection *input_section; 25260484Sobrien bfd *output_bfd; 25360484Sobrien char **error_message ATTRIBUTE_UNUSED; 25460484Sobrien{ 25560484Sobrien bfd_vma relocation; 25660484Sobrien bfd_size_type addr = reloc_entry->address; 25760484Sobrien long target = bfd_get_32 (abfd, (bfd_byte *) data + addr); 25860484Sobrien bfd_reloc_status_type flag = bfd_reloc_ok; 25977298Sobrien 26060484Sobrien /* If this is an undefined symbol, return error */ 26160484Sobrien if (symbol->section == &bfd_und_section 26260484Sobrien && (symbol->flags & BSF_WEAK) == 0) 26360484Sobrien return output_bfd ? bfd_reloc_ok : bfd_reloc_undefined; 26460484Sobrien 26560484Sobrien /* If the sections are different, and we are doing a partial relocation, 26660484Sobrien just ignore it for now. */ 26760484Sobrien if (symbol->section->name != input_section->name 26860484Sobrien && output_bfd != (bfd *)NULL) 26960484Sobrien return bfd_reloc_ok; 27060484Sobrien 27160484Sobrien relocation = (target & 0x00ffffff) << 2; 27260484Sobrien relocation = (relocation ^ 0x02000000) - 0x02000000; /* Sign extend */ 27360484Sobrien relocation += symbol->value; 27460484Sobrien relocation += symbol->section->output_section->vma; 27560484Sobrien relocation += symbol->section->output_offset; 27660484Sobrien relocation += reloc_entry->addend; 27760484Sobrien relocation -= input_section->output_section->vma; 27860484Sobrien relocation -= input_section->output_offset; 27960484Sobrien relocation -= addr; 28060484Sobrien if (relocation & 3) 28160484Sobrien return bfd_reloc_overflow; 28260484Sobrien 28360484Sobrien /* Check for overflow */ 28460484Sobrien if (relocation & 0x02000000) 28560484Sobrien { 28660484Sobrien if ((relocation & ~ (bfd_vma) 0x03ffffff) != ~ (bfd_vma) 0x03ffffff) 28760484Sobrien flag = bfd_reloc_overflow; 28860484Sobrien } 28960484Sobrien else if (relocation & ~0x03ffffff) 29060484Sobrien flag = bfd_reloc_overflow; 29160484Sobrien 29260484Sobrien target &= ~0x00ffffff; 29360484Sobrien target |= (relocation >> 2) & 0x00ffffff; 29460484Sobrien bfd_put_32 (abfd, target, (bfd_byte *) data + addr); 29560484Sobrien 29660484Sobrien /* Now the ARM magic... Change the reloc type so that it is marked as done. 29760484Sobrien Strictly this is only necessary if we are doing a partial relocation. */ 29860484Sobrien reloc_entry->howto = &MY(howto_table)[7]; 29977298Sobrien 30060484Sobrien return flag; 30160484Sobrien} 30260484Sobrien 30360484Sobrienreloc_howto_type * 30477298SobrienMY(bfd_reloc_type_lookup) (abfd,code) 30560484Sobrien bfd *abfd; 30660484Sobrien bfd_reloc_code_real_type code; 30760484Sobrien{ 30860484Sobrien#define ASTD(i,j) case i: return &MY(howto_table)[j] 30960484Sobrien if (code == BFD_RELOC_CTOR) 31060484Sobrien switch (bfd_get_arch_info (abfd)->bits_per_address) 31160484Sobrien { 31260484Sobrien case 32: 31360484Sobrien code = BFD_RELOC_32; 31460484Sobrien break; 31560484Sobrien default: return (CONST struct reloc_howto_struct *) 0; 31660484Sobrien } 31760484Sobrien 31860484Sobrien switch (code) 31960484Sobrien { 32060484Sobrien ASTD (BFD_RELOC_16, 1); 32160484Sobrien ASTD (BFD_RELOC_32, 2); 32260484Sobrien ASTD (BFD_RELOC_ARM_PCREL_BRANCH, 3); 32360484Sobrien ASTD (BFD_RELOC_8_PCREL, 4); 32460484Sobrien ASTD (BFD_RELOC_16_PCREL, 5); 32560484Sobrien ASTD (BFD_RELOC_32_PCREL, 6); 32660484Sobrien default: return (CONST struct reloc_howto_struct *) 0; 32760484Sobrien } 32860484Sobrien} 32960484Sobrien 33060484Sobrien#define MY_swap_std_reloc_in MY(swap_std_reloc_in) 33160484Sobrien#define MY_swap_std_reloc_out MY(swap_std_reloc_out) 33260484Sobrien#define MY_get_section_contents _bfd_generic_get_section_contents 33360484Sobrien/* #define MY_bfd_link_hash_table_create _bfd_generic_link_hash_table_create */ 33460484Sobrien/* #define MY_bfd_link_add_symbols _bfd_generic_link_add_symbols */ 33560484Sobrien/* #define MY_bfd_final_link _bfd_generic_final_link */ 33660484Sobrien 33760484Sobrien#include "aoutx.h" 33860484Sobrien 33960484Sobrienstatic void 34060484SobrienMY_swap_std_reloc_in (abfd, bytes, cache_ptr, symbols, symcount) 34160484Sobrien bfd *abfd; 34260484Sobrien struct reloc_std_external *bytes; 34360484Sobrien arelent *cache_ptr; 34460484Sobrien asymbol **symbols; 34560484Sobrien bfd_size_type symcount ATTRIBUTE_UNUSED; 34660484Sobrien{ 34760484Sobrien int r_index; 34860484Sobrien int r_extern; 34960484Sobrien int r_pcrel; 35060484Sobrien struct aoutdata *su = &(abfd->tdata.aout_data->a); 35160484Sobrien 35260484Sobrien cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address); 35360484Sobrien 35460484Sobrien cache_ptr->howto = MY_reloc_howto (abfd, bytes, r_index, r_extern, r_pcrel); 35560484Sobrien 35660484Sobrien MOVE_ADDRESS (0); 35760484Sobrien} 35860484Sobrien 35960484Sobrienvoid 36060484SobrienMY_swap_std_reloc_out (abfd, g, natptr) 36160484Sobrien bfd *abfd; 36260484Sobrien arelent *g; 36360484Sobrien struct reloc_std_external *natptr; 36460484Sobrien{ 36560484Sobrien int r_index; 36660484Sobrien asymbol *sym = *(g->sym_ptr_ptr); 36760484Sobrien int r_extern; 36860484Sobrien int r_length; 36960484Sobrien int r_pcrel; 37060484Sobrien int r_neg = 0; /* Negative relocs use the BASEREL bit. */ 37160484Sobrien asection *output_section = sym->section->output_section; 37260484Sobrien 37360484Sobrien PUT_WORD(abfd, g->address, natptr->r_address); 37460484Sobrien 37560484Sobrien r_length = g->howto->size ; /* Size as a power of two */ 37660484Sobrien if (r_length < 0) 37760484Sobrien { 37860484Sobrien r_length = -r_length; 37960484Sobrien r_neg = 1; 38060484Sobrien } 38160484Sobrien 38260484Sobrien r_pcrel = (int) g->howto->pc_relative; /* Relative to PC? */ 38360484Sobrien 38460484Sobrien /* For RISC iX, in pc-relative relocs the r_pcrel bit means that the 38560484Sobrien relocation has been done already (Only for the 26-bit one I think)???!!! 38660484Sobrien */ 38760484Sobrien 38860484Sobrien if (g->howto->type == 3) 38960484Sobrien { 39060484Sobrien r_length = 3; 39160484Sobrien r_pcrel = 0; 39260484Sobrien } 39360484Sobrien else if (g->howto->type == 7) 39477298Sobrien { 39560484Sobrien r_length = 3; 39660484Sobrien r_pcrel = 1; 39760484Sobrien } 39860484Sobrien 39960484Sobrien#if 0 40060484Sobrien /* For a standard reloc, the addend is in the object file. */ 40160484Sobrien r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma; 40260484Sobrien#endif 40360484Sobrien 40460484Sobrien /* name was clobbered by aout_write_syms to be symbol index */ 40560484Sobrien 40660484Sobrien /* If this relocation is relative to a symbol then set the 40760484Sobrien r_index to the symbols index, and the r_extern bit. 40860484Sobrien 40960484Sobrien Absolute symbols can come in in two ways, either as an offset 41060484Sobrien from the abs section, or as a symbol which has an abs value. 41160484Sobrien check for that here 41260484Sobrien */ 41360484Sobrien 41460484Sobrien if (bfd_is_com_section (output_section) 41560484Sobrien || output_section == &bfd_abs_section 41660484Sobrien || output_section == &bfd_und_section) 41760484Sobrien { 41860484Sobrien if (bfd_abs_section.symbol == sym) 41960484Sobrien { 42060484Sobrien /* Whoops, looked like an abs symbol, but is really an offset 42160484Sobrien from the abs section */ 42260484Sobrien r_index = 0; 42360484Sobrien r_extern = 0; 42460484Sobrien } 42560484Sobrien else 42660484Sobrien { 42760484Sobrien /* Fill in symbol */ 42860484Sobrien r_extern = 1; 42960484Sobrien r_index = (*(g->sym_ptr_ptr))->KEEPIT; 43060484Sobrien } 43160484Sobrien } 43260484Sobrien else 43360484Sobrien { 43460484Sobrien /* Just an ordinary section */ 43560484Sobrien r_extern = 0; 43660484Sobrien r_index = output_section->target_index; 43760484Sobrien } 43860484Sobrien 43960484Sobrien /* now the fun stuff */ 44060484Sobrien if (bfd_header_big_endian (abfd)) 44160484Sobrien { 44260484Sobrien natptr->r_index[0] = r_index >> 16; 44360484Sobrien natptr->r_index[1] = r_index >> 8; 44460484Sobrien natptr->r_index[2] = r_index; 44560484Sobrien natptr->r_type[0] = 44660484Sobrien ( (r_extern ? RELOC_STD_BITS_EXTERN_BIG: 0) 44760484Sobrien | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG: 0) 44860484Sobrien | (r_neg ? RELOC_ARM_BITS_NEG_BIG: 0) 44960484Sobrien | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG)); 45060484Sobrien } 45160484Sobrien else 45260484Sobrien { 45360484Sobrien natptr->r_index[2] = r_index >> 16; 45460484Sobrien natptr->r_index[1] = r_index >> 8; 45560484Sobrien natptr->r_index[0] = r_index; 45660484Sobrien natptr->r_type[0] = 45760484Sobrien ( (r_extern ? RELOC_STD_BITS_EXTERN_LITTLE: 0) 45860484Sobrien | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE: 0) 45960484Sobrien | (r_neg ? RELOC_ARM_BITS_NEG_LITTLE: 0) 46060484Sobrien | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE)); 46160484Sobrien } 46260484Sobrien} 46360484Sobrien 46460484Sobrien#define MY_BFD_TARGET 46560484Sobrien 46660484Sobrien#include "aout-target.h" 46760484Sobrien 46860484Sobrienextern const bfd_target aout_arm_big_vec; 46960484Sobrien 47060484Sobrienconst bfd_target aout_arm_little_vec = 47160484Sobrien{ 47260484Sobrien "a.out-arm-little", /* name */ 47360484Sobrien bfd_target_aout_flavour, 47460484Sobrien BFD_ENDIAN_LITTLE, /* target byte order (little) */ 47560484Sobrien BFD_ENDIAN_LITTLE, /* target headers byte order (little) */ 47660484Sobrien (HAS_RELOC | EXEC_P | /* object flags */ 47760484Sobrien HAS_LINENO | HAS_DEBUG | 47860484Sobrien HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED), 47960484Sobrien (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), 48060484Sobrien MY_symbol_leading_char, 48160484Sobrien AR_PAD_CHAR, /* ar_pad_char */ 48260484Sobrien 15, /* ar_max_namelen */ 48360484Sobrien bfd_getl64, bfd_getl_signed_64, bfd_putl64, 48460484Sobrien bfd_getl32, bfd_getl_signed_32, bfd_putl32, 48560484Sobrien bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ 48660484Sobrien bfd_getl64, bfd_getl_signed_64, bfd_putl64, 48760484Sobrien bfd_getl32, bfd_getl_signed_32, bfd_putl32, 48860484Sobrien bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ 48960484Sobrien {_bfd_dummy_target, MY_object_p, /* bfd_check_format */ 49060484Sobrien bfd_generic_archive_p, MY_core_file_p}, 49160484Sobrien {bfd_false, MY_mkobject, /* bfd_set_format */ 49260484Sobrien _bfd_generic_mkarchive, bfd_false}, 49360484Sobrien {bfd_false, MY_write_object_contents, /* bfd_write_contents */ 49460484Sobrien _bfd_write_archive_contents, bfd_false}, 49560484Sobrien 49660484Sobrien BFD_JUMP_TABLE_GENERIC (MY), 49760484Sobrien BFD_JUMP_TABLE_COPY (MY), 49860484Sobrien BFD_JUMP_TABLE_CORE (MY), 49960484Sobrien BFD_JUMP_TABLE_ARCHIVE (MY), 50060484Sobrien BFD_JUMP_TABLE_SYMBOLS (MY), 50160484Sobrien BFD_JUMP_TABLE_RELOCS (MY), 50260484Sobrien BFD_JUMP_TABLE_WRITE (MY), 50360484Sobrien BFD_JUMP_TABLE_LINK (MY), 50460484Sobrien BFD_JUMP_TABLE_DYNAMIC (MY), 50560484Sobrien 50660484Sobrien & aout_arm_big_vec, 50777298Sobrien 50860484Sobrien (PTR) MY_backend_data, 50960484Sobrien}; 51060484Sobrien 51160484Sobrienconst bfd_target aout_arm_big_vec = 51260484Sobrien{ 51360484Sobrien "a.out-arm-big", /* name */ 51460484Sobrien bfd_target_aout_flavour, 51560484Sobrien BFD_ENDIAN_BIG, /* target byte order (big) */ 51660484Sobrien BFD_ENDIAN_BIG, /* target headers byte order (big) */ 51760484Sobrien (HAS_RELOC | EXEC_P | /* object flags */ 51860484Sobrien HAS_LINENO | HAS_DEBUG | 51960484Sobrien HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED), 52060484Sobrien (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), 52160484Sobrien MY_symbol_leading_char, 52260484Sobrien AR_PAD_CHAR, /* ar_pad_char */ 52360484Sobrien 15, /* ar_max_namelen */ 52460484Sobrien bfd_getb64, bfd_getb_signed_64, bfd_putb64, 52560484Sobrien bfd_getb32, bfd_getb_signed_32, bfd_putb32, 52660484Sobrien bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ 52760484Sobrien bfd_getb64, bfd_getb_signed_64, bfd_putb64, 52860484Sobrien bfd_getb32, bfd_getb_signed_32, bfd_putb32, 52960484Sobrien bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ 53060484Sobrien {_bfd_dummy_target, MY_object_p, /* bfd_check_format */ 53160484Sobrien bfd_generic_archive_p, MY_core_file_p}, 53260484Sobrien {bfd_false, MY_mkobject, /* bfd_set_format */ 53360484Sobrien _bfd_generic_mkarchive, bfd_false}, 53460484Sobrien {bfd_false, MY_write_object_contents, /* bfd_write_contents */ 53560484Sobrien _bfd_write_archive_contents, bfd_false}, 53660484Sobrien 53760484Sobrien BFD_JUMP_TABLE_GENERIC (MY), 53860484Sobrien BFD_JUMP_TABLE_COPY (MY), 53960484Sobrien BFD_JUMP_TABLE_CORE (MY), 54060484Sobrien BFD_JUMP_TABLE_ARCHIVE (MY), 54160484Sobrien BFD_JUMP_TABLE_SYMBOLS (MY), 54260484Sobrien BFD_JUMP_TABLE_RELOCS (MY), 54360484Sobrien BFD_JUMP_TABLE_WRITE (MY), 54460484Sobrien BFD_JUMP_TABLE_LINK (MY), 54560484Sobrien BFD_JUMP_TABLE_DYNAMIC (MY), 54660484Sobrien 54760484Sobrien & aout_arm_little_vec, 54877298Sobrien 54960484Sobrien (PTR) MY_backend_data, 55060484Sobrien}; 551