#include "sysdep.h"
#include "libbfd.h"
#include "seclet.h"
-/*doc*
+/*
+DOCDD
INODE
typedef arelent, howto manager, Relocations, Relocations
will be relative to this point - for example, a relocation
type which modifies the bottom two bytes of a four byte word
would not touch the first byte pointed to in a big endian
- world. @item addend The addend is a value provided by the back
- end to be added (!) to the relocation offset. Its
- interpretation is dependent upon the howto. For example, on
- the 68k the code:
+ world.
+
+ o addend
+
+ The addend is a value provided by the back end to be added (!)
+ to the relocation offset. Its interpretation is dependent upon
+ the howto. For example, on the 68k the code:
| char foo[];
. unsigned int rightshift;
.
. {* The size of the item to be relocated - 0, is one byte, 1 is 2
-. bytes, 3 is four bytes. *}
-. unsigned int size;
+. bytes, 3 is four bytes. A -ve value indicates that the
+. result is to be subtracted from the data*}
+. int size;
.
. {* Now obsolete *}
. unsigned int bitsize;
. called rather than the normal function. This allows really
. strange relocation methods to be accomodated (eg, i960 callj
. instructions). *}
-. bfd_reloc_status_type EXFUN ((*special_function),
-. (bfd *abfd,
+. bfd_reloc_status_type (*special_function)
+. PARAMS ((bfd *abfd,
. arelent *reloc_entry,
. struct symbol_cache_entry *symbol,
. PTR data,
. asection *input_section,
-. bfd *output_bfd ));
+. bfd *output_bfd));
.
. {* The textual name of the relocation type. *}
. char *name;
}
- if (output_bfd!= (bfd *)NULL) {
- if ( howto->partial_inplace == false) {
+ if (output_bfd!= (bfd *)NULL)
+ {
+ if ( howto->partial_inplace == false)
+ {
/*
This is a partial relocation, and we want to apply the relocation
to the reloc entry rather than the raw data. Modify the reloc
If we've relocated with a symbol with a section, change
into a ref to the section belonging to the symbol
*/
- reloc_entry->addend = relocation ;
- reloc_entry->address += input_section->output_offset;
+ reloc_entry->address += input_section->output_offset;
+ if (abfd->xvec->flavour == bfd_target_coff_flavour)
+ {
+ relocation -= reloc_entry->addend;
+ reloc_entry->addend = 0;
+ }
+ else
+ {
+ reloc_entry->addend = relocation ;
+ }
}
}
else
{
-
reloc_entry->addend = 0;
}
-
/*
Either we are relocating all the way, or we don't want to apply
the relocation to the reloc entry (probably because there isn't
bfd_put_32(abfd,x, (bfd_byte *)data + addr);
}
break;
+ case -2:
+ {
+ long x = bfd_get_32(abfd, (bfd_byte *) data + addr);
+ relocation = -relocation;
+ DOIT(x);
+ bfd_put_32(abfd,x, (bfd_byte *)data + addr);
+ }
+ break;
+
case 3:
/* Do nothing */
/*
+DOCDD
INODE
howto manager, , typedef arelent, Relocations
CODE_FRAGMENT
.
.typedef enum bfd_reloc_code_real
+.
.{
. {* 16 bits wide, simple reloc *}
. BFD_RELOC_16,
SYNOPSIS
CONST struct reloc_howto_struct *
- bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_type code);
+ bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code);
DESCRIPTION
This routine returns a pointer to a howto struct which when
CONST struct reloc_howto_struct *
-DEFUN(bfd_reloc_type_lookup,(arch, code),
+DEFUN(bfd_reloc_type_lookup,(abfd, code),
bfd *abfd AND
- bfd_reloc_code_type code)
+ bfd_reloc_code_real_type code)
{
return BFD_SEND (abfd, reloc_type_lookup, (abfd, code));
}
SYNOPSIS
CONST struct reloc_howto_struct *bfd_default_reloc_type_lookup
(CONST struct bfd_arch_info *,
- bfd_reloc_code_type code);
+ bfd_reloc_code_real_type code);
DESCRIPTION
Provides a default relocation lookuperer for any architectue
CONST struct reloc_howto_struct *
DEFUN(bfd_default_reloc_type_lookup,(arch, code),
CONST struct bfd_arch_info *arch AND
- bfd_reloc_code_type code)
+ bfd_reloc_code_real_type code)
{
switch (code)
{
default:
BFD_FAIL();
}
-return (struct reloc_howto_struct *)NULL;
+return (CONST struct reloc_howto_struct *)NULL;
}