mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 12:03:41 +08:00
Fix bugs and remove compile time warnings for N"32K port.
This commit is contained in:
parent
cd67d26656
commit
4eb6b71c65
@ -3,6 +3,22 @@
|
||||
* elf32-i386.c (elf_i386_copy_indirect_symbol): Swap tls_type
|
||||
if _bfd_elf_link_hash_copy_indirect will swap got.refcount.
|
||||
|
||||
2002-07-31 Ian Dall <ian@sibyl.beware.dropbear.id.au>
|
||||
|
||||
* cpu-ns32k.c (_bfd_ns32k_put_immdeiate, _bfd_ns32k_get_immediate):
|
||||
There is no 8 byte relocation type for this architecture.
|
||||
(do_ns32k_reloc): Use bfd_vma instead of native types.
|
||||
(bfd_ns32k_put_immediate, _bfd_ns32k_relocate_contents) put_data
|
||||
returns void.
|
||||
(_bfd_ns32k_put_displacement): Don't check for overflow. We can
|
||||
rely on generic code to do that.
|
||||
* aout-ns32k.c (howto_table): Add appropriate overflow detection
|
||||
to all table entries.
|
||||
(_bfd_ns32k_relocate_contents): put_data returns void.
|
||||
* ns32k.h: (_bfd_ns32k_put_displacement, _bfd_ns32k_put_immediate)
|
||||
(_bfd_do_ns32k_reloc_contents): Fix prototypes. put data functions
|
||||
return void.
|
||||
|
||||
2002-07-31 Ian Dall <ian@sibyl.beware.dropbear.id.au>
|
||||
|
||||
* aoutx.h (aout_link_check_ar_symbols): Whether to include an
|
||||
|
@ -1,23 +1,23 @@
|
||||
/* BFD back-end for ns32k a.out-ish binaries.
|
||||
Copyright 1990, 1991, 1992, 1994, 1995, 1996, 1998, 2000, 2001
|
||||
Copyright 1990, 1991, 1992, 1994, 1995, 1996, 1998, 2000, 2001, 2002
|
||||
Free Software Foundation, Inc.
|
||||
Contributed by Ian Dall (idall@eleceng.adelaide.edu.au).
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
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 2 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.
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#define BYTES_IN_WORD 4
|
||||
|
||||
@ -49,16 +49,16 @@ void bfd_ns32k_arch PARAMS ((void));
|
||||
|
||||
#define MY(OP) MYNS(OP)
|
||||
|
||||
#define MY_swap_std_reloc_in MY(swap_std_reloc_in)
|
||||
#define MY_swap_std_reloc_in MY(swap_std_reloc_in)
|
||||
#define MY_swap_std_reloc_out MY(swap_std_reloc_out)
|
||||
|
||||
static void
|
||||
MY_swap_std_reloc_in PARAMS ((bfd *abfd, struct reloc_std_external *bytes,
|
||||
arelent *cache_ptr, asymbol **symbols,
|
||||
bfd_size_type symcount));
|
||||
MY_swap_std_reloc_in PARAMS ((bfd *, struct reloc_std_external *,
|
||||
arelent *, asymbol **,
|
||||
bfd_size_type));
|
||||
static void
|
||||
MY_swap_std_reloc_out PARAMS ((bfd *abfd, arelent *g,
|
||||
struct reloc_std_external *natptr));
|
||||
MY_swap_std_reloc_out PARAMS ((bfd *, arelent *,
|
||||
struct reloc_std_external *));
|
||||
reloc_howto_type *
|
||||
MY(reloc_howto) PARAMS ((bfd *, struct reloc_std_external *,
|
||||
int *, int *, int *));
|
||||
@ -94,47 +94,48 @@ MY(put_reloc) PARAMS ((bfd *, int, int, bfd_vma, reloc_howto_type *,
|
||||
|
||||
In addition, for historical reasons the encoding of the relocation types
|
||||
in the a.out format relocation entries is such that even the relocation
|
||||
methods which are standard are not encoded the standard way. */
|
||||
methods which are standard are not encoded the standard way. */
|
||||
|
||||
reloc_howto_type MY(howto_table)[] =
|
||||
{
|
||||
/* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */
|
||||
/* ns32k immediate operands. */
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_8, 0, 0, 8, false, 0, true,
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_8, 0, 0, 8, false, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_imm, "NS32K_IMM_8",
|
||||
true, 0x000000ff,0x000000ff, false),
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_16, 0, 1, 16, false, 0, true,
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_16, 0, 1, 16, false, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_imm, "NS32K_IMM_16",
|
||||
true, 0x0000ffff,0x0000ffff, false),
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_32, 0, 2, 32, false, 0, true,
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_32, 0, 2, 32, false, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_imm, "NS32K_IMM_32",
|
||||
true, 0xffffffff,0xffffffff, false),
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_8_PCREL, 0, 0, 8, true, 0, false,
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_8_PCREL, 0, 0, 8, true, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_imm, "PCREL_NS32K_IMM_8",
|
||||
true, 0x000000ff, 0x000000ff, false),
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_16_PCREL, 0, 1, 16, true, 0, false,
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_16_PCREL, 0, 1, 16, true, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_imm, "PCREL_NS32K_IMM_16",
|
||||
true, 0x0000ffff,0x0000ffff, false),
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_32_PCREL, 0, 2, 32, true, 0, false,
|
||||
HOWTO (BFD_RELOC_NS32K_IMM_32_PCREL, 0, 2, 32, true, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_imm, "PCREL_NS32K_IMM_32",
|
||||
true, 0xffffffff,0xffffffff, false),
|
||||
|
||||
/* ns32k displacements. */
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_8, 0, 0, 8, false, 0, true,
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_8, 0, 0, 7, false, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_disp, "NS32K_DISP_8",
|
||||
true, 0x000000ff,0x000000ff, false),
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_16, 0, 1, 16, false, 0, true,
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_16, 0, 1, 14, false, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_disp, "NS32K_DISP_16",
|
||||
true, 0x0000ffff, 0x0000ffff, false),
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_32, 0, 2, 32, false, 0, true,
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_32, 0, 2, 30, false, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_disp, "NS32K_DISP_32",
|
||||
true, 0xffffffff, 0xffffffff, false),
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_8_PCREL, 0, 0, 8, true, 0, false,
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_8_PCREL, 0, 0, 7, true, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_disp, "PCREL_NS32K_DISP_8",
|
||||
true, 0x000000ff,0x000000ff, false),
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_16_PCREL, 0, 1, 16, true, 0, false,
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_16_PCREL, 0, 1, 14, true, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_disp, "PCREL_NS32K_DISP_16",
|
||||
true, 0x0000ffff,0x0000ffff, false),
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_32_PCREL, 0, 2, 32, true, 0, false,
|
||||
HOWTO (BFD_RELOC_NS32K_DISP_32_PCREL, 0, 2, 30, true, 0, complain_overflow_signed,
|
||||
_bfd_ns32k_reloc_disp, "PCREL_NS32K_DISP_32",
|
||||
true, 0xffffffff,0xffffffff, false),
|
||||
|
||||
@ -355,7 +356,7 @@ _bfd_ns32k_relocate_contents (howto, input_bfd, relocation, location)
|
||||
{
|
||||
int r_ns32k_type = (howto - MY(howto_table)) / 6;
|
||||
bfd_vma (*get_data) PARAMS ((bfd_byte *, int));
|
||||
int (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
|
||||
void (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
|
||||
|
||||
switch (r_ns32k_type)
|
||||
{
|
||||
|
230
bfd/cpu-ns32k.c
230
bfd/cpu-ns32k.c
@ -4,21 +4,21 @@
|
||||
Almost totally rewritten by Ian Dall from initial work
|
||||
by Andrew Cagney.
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
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 2 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.
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "bfd.h"
|
||||
#include "sysdep.h"
|
||||
@ -30,7 +30,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
static const bfd_arch_info_type arch_info_struct[] =
|
||||
{
|
||||
N(32532,"ns32k:32532",true, 0), /* the word ns32k will match this too */
|
||||
N(32532,"ns32k:32532",true, 0), /* The word ns32k will match this too. */
|
||||
};
|
||||
|
||||
const bfd_arch_info_type bfd_ns32k_arch =
|
||||
@ -40,7 +40,7 @@ static bfd_reloc_status_type do_ns32k_reloc
|
||||
PARAMS ((bfd *, arelent *, struct symbol_cache_entry *, PTR, asection *,
|
||||
bfd *, char **,
|
||||
bfd_vma (*) (bfd_byte *, int),
|
||||
int (*) (bfd_vma, bfd_byte *, int)));
|
||||
void (*) (bfd_vma, bfd_byte *, int)));
|
||||
|
||||
bfd_vma
|
||||
_bfd_ns32k_get_displacement (buffer, size)
|
||||
@ -48,6 +48,7 @@ _bfd_ns32k_get_displacement (buffer, size)
|
||||
int size;
|
||||
{
|
||||
bfd_signed_vma value;
|
||||
|
||||
switch (size)
|
||||
{
|
||||
case 1:
|
||||
@ -70,10 +71,11 @@ _bfd_ns32k_get_displacement (buffer, size)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
int
|
||||
void
|
||||
_bfd_ns32k_put_displacement (value, buffer, size)
|
||||
bfd_vma value;
|
||||
bfd_byte *buffer;
|
||||
@ -82,15 +84,11 @@ _bfd_ns32k_put_displacement (value, buffer, size)
|
||||
switch (size)
|
||||
{
|
||||
case 1:
|
||||
if (value + 0x40 > 0x7f)
|
||||
return -1;
|
||||
value &= 0x7f;
|
||||
*buffer++ = value;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if (value + 0x2000 > 0x3fff)
|
||||
return -1;
|
||||
value &= 0x3fff;
|
||||
value |= 0x8000;
|
||||
*buffer++ = (value >> 8);
|
||||
@ -98,19 +96,14 @@ _bfd_ns32k_put_displacement (value, buffer, size)
|
||||
break;
|
||||
|
||||
case 4:
|
||||
/* FIXME: is this correct? -0x1f000000 <= value < 0x2000000 */
|
||||
if (value + 0x1f000000 > 0x3effffff)
|
||||
return -1;
|
||||
value |= (bfd_vma) 0xc0000000;
|
||||
*buffer++ = (value >> 24);
|
||||
*buffer++ = (value >> 16);
|
||||
*buffer++ = (value >> 8);
|
||||
*buffer++ = value;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
bfd_vma
|
||||
@ -119,13 +112,9 @@ _bfd_ns32k_get_immediate (buffer, size)
|
||||
int size;
|
||||
{
|
||||
bfd_vma value = 0;
|
||||
|
||||
switch (size)
|
||||
{
|
||||
case 8:
|
||||
value = (value << 8) | (*buffer++ & 0xff);
|
||||
value = (value << 8) | (*buffer++ & 0xff);
|
||||
value = (value << 8) | (*buffer++ & 0xff);
|
||||
value = (value << 8) | (*buffer++ & 0xff);
|
||||
case 4:
|
||||
value = (value << 8) | (*buffer++ & 0xff);
|
||||
value = (value << 8) | (*buffer++ & 0xff);
|
||||
@ -133,11 +122,14 @@ _bfd_ns32k_get_immediate (buffer, size)
|
||||
value = (value << 8) | (*buffer++ & 0xff);
|
||||
case 1:
|
||||
value = (value << 8) | (*buffer++ & 0xff);
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
int
|
||||
void
|
||||
_bfd_ns32k_put_immediate (value, buffer, size)
|
||||
bfd_vma value;
|
||||
bfd_byte *buffer;
|
||||
@ -146,11 +138,6 @@ _bfd_ns32k_put_immediate (value, buffer, size)
|
||||
buffer += size - 1;
|
||||
switch (size)
|
||||
{
|
||||
case 8:
|
||||
*buffer-- = (value & 0xff); value >>= 8;
|
||||
*buffer-- = (value & 0xff); value >>= 8;
|
||||
*buffer-- = (value & 0xff); value >>= 8;
|
||||
*buffer-- = (value & 0xff); value >>= 8;
|
||||
case 4:
|
||||
*buffer-- = (value & 0xff); value >>= 8;
|
||||
*buffer-- = (value & 0xff); value >>= 8;
|
||||
@ -159,14 +146,13 @@ _bfd_ns32k_put_immediate (value, buffer, size)
|
||||
case 1:
|
||||
*buffer-- = (value & 0xff); value >>= 8;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This is just like the standard perform_relocation except we
|
||||
* use get_data and put_data which know about the ns32k
|
||||
* storage methods.
|
||||
* This is probably a lot more complicated than it needs to be!
|
||||
*/
|
||||
use get_data and put_data which know about the ns32k storage
|
||||
methods. This is probably a lot more complicated than it
|
||||
needs to be! */
|
||||
|
||||
static bfd_reloc_status_type
|
||||
do_ns32k_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
|
||||
error_message, get_data, put_data)
|
||||
@ -178,7 +164,7 @@ do_ns32k_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
|
||||
bfd *output_bfd;
|
||||
char **error_message ATTRIBUTE_UNUSED;
|
||||
bfd_vma (*get_data) PARAMS ((bfd_byte *, int));
|
||||
int (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
|
||||
void (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
|
||||
{
|
||||
int overflow = 0;
|
||||
bfd_vma relocation;
|
||||
@ -262,7 +248,6 @@ do_ns32k_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
|
||||
producing relocateable output it is not what the code
|
||||
actually does. I don't want to change it, because it seems
|
||||
far too likely that something will break. */
|
||||
|
||||
relocation -=
|
||||
input_section->output_section->vma + input_section->output_offset;
|
||||
|
||||
@ -299,71 +284,76 @@ do_ns32k_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
|
||||
relocation with -r. Removing the line below this comment
|
||||
fixes that problem; see PR 2953.
|
||||
|
||||
However, Ian wrote the following, regarding removing the line below,
|
||||
which explains why it is still enabled: --djm
|
||||
However, Ian wrote the following, regarding removing the line
|
||||
below, which explains why it is still enabled: --djm
|
||||
|
||||
If you put a patch like that into BFD you need to check all the COFF
|
||||
linkers. I am fairly certain that patch will break coff-i386 (e.g.,
|
||||
SCO); see coff_i386_reloc in coff-i386.c where I worked around the
|
||||
problem in a different way. There may very well be a reason that the
|
||||
code works as it does.
|
||||
If you put a patch like that into BFD you need to check all
|
||||
the COFF linkers. I am fairly certain that patch will break
|
||||
coff-i386 (e.g., SCO); see coff_i386_reloc in coff-i386.c
|
||||
where I worked around the problem in a different way. There
|
||||
may very well be a reason that the code works as it does.
|
||||
|
||||
Hmmm. The first obvious point is that bfd_perform_relocation should
|
||||
not have any tests that depend upon the flavour. It's seem like
|
||||
entirely the wrong place for such a thing. The second obvious point
|
||||
is that the current code ignores the reloc addend when producing
|
||||
relocateable output for COFF. That's peculiar. In fact, I really
|
||||
have no idea what the point of the line you want to remove is.
|
||||
Hmmm. The first obvious point is that bfd_perform_relocation
|
||||
should not have any tests that depend upon the flavour. It's
|
||||
seem like entirely the wrong place for such a thing. The
|
||||
second obvious point is that the current code ignores the
|
||||
reloc addend when producing relocateable output for COFF.
|
||||
That's peculiar. In fact, I really have no idea what the
|
||||
point of the line you want to remove is.
|
||||
|
||||
A typical COFF reloc subtracts the old value of the symbol and adds in
|
||||
the new value to the location in the object file (if it's a pc
|
||||
relative reloc it adds the difference between the symbol value and the
|
||||
location). When relocating we need to preserve that property.
|
||||
A typical COFF reloc subtracts the old value of the symbol
|
||||
and adds in the new value to the location in the object file
|
||||
(if it's a pc relative reloc it adds the difference between
|
||||
the symbol value and the location). When relocating we need
|
||||
to preserve that property.
|
||||
|
||||
BFD handles this by setting the addend to the negative of the old
|
||||
value of the symbol. Unfortunately it handles common symbols in a
|
||||
non-standard way (it doesn't subtract the old value) but that's a
|
||||
different story (we can't change it without losing backward
|
||||
compatibility with old object files) (coff-i386 does subtract the old
|
||||
value, to be compatible with existing coff-i386 targets, like SCO).
|
||||
BFD handles this by setting the addend to the negative of the
|
||||
old value of the symbol. Unfortunately it handles common
|
||||
symbols in a non-standard way (it doesn't subtract the old
|
||||
value) but that's a different story (we can't change it
|
||||
without losing backward compatibility with old object files)
|
||||
(coff-i386 does subtract the old value, to be compatible with
|
||||
existing coff-i386 targets, like SCO).
|
||||
|
||||
So everything works fine when not producing relocateable output. When
|
||||
we are producing relocateable output, logically we should do exactly
|
||||
what we do when not producing relocateable output. Therefore, your
|
||||
patch is correct. In fact, it should probably always just set
|
||||
reloc_entry->addend to 0 for all cases, since it is, in fact, going to
|
||||
add the value into the object file. This won't hurt the COFF code,
|
||||
which doesn't use the addend; I'm not sure what it will do to other
|
||||
formats (the thing to check for would be whether any formats both use
|
||||
the addend and set partial_inplace).
|
||||
So everything works fine when not producing relocateable
|
||||
output. When we are producing relocateable output, logically
|
||||
we should do exactly what we do when not producing
|
||||
relocateable output. Therefore, your patch is correct. In
|
||||
fact, it should probably always just set reloc_entry->addend
|
||||
to 0 for all cases, since it is, in fact, going to add the
|
||||
value into the object file. This won't hurt the COFF code,
|
||||
which doesn't use the addend; I'm not sure what it will do
|
||||
to other formats (the thing to check for would be whether
|
||||
any formats both use the addend and set partial_inplace).
|
||||
|
||||
When I wanted to make coff-i386 produce relocateable output, I ran
|
||||
into the problem that you are running into: I wanted to remove that
|
||||
line. Rather than risk it, I made the coff-i386 relocs use a special
|
||||
function; it's coff_i386_reloc in coff-i386.c. The function
|
||||
specifically adds the addend field into the object file, knowing that
|
||||
bfd_perform_relocation is not going to. If you remove that line, then
|
||||
coff-i386.c will wind up adding the addend field in twice. It's
|
||||
trivial to fix; it just needs to be done.
|
||||
When I wanted to make coff-i386 produce relocateable output,
|
||||
I ran into the problem that you are running into: I wanted
|
||||
to remove that line. Rather than risk it, I made the
|
||||
coff-i386 relocs use a special function; it's coff_i386_reloc
|
||||
in coff-i386.c. The function specifically adds the addend
|
||||
field into the object file, knowing that bfd_perform_relocation
|
||||
is not going to. If you remove that line, then coff-i386.c
|
||||
will wind up adding the addend field in twice. It's trivial
|
||||
to fix; it just needs to be done.
|
||||
|
||||
The problem with removing the line is just that it may break some
|
||||
working code. With BFD it's hard to be sure of anything. The right
|
||||
way to deal with this is simply to build and test at least all the
|
||||
supported COFF targets. It should be straightforward if time and disk
|
||||
space consuming. For each target:
|
||||
1) build the linker
|
||||
2) generate some executable, and link it using -r (I would
|
||||
probably use paranoia.o and link against newlib/libc.a, which
|
||||
for all the supported targets would be available in
|
||||
/usr/cygnus/progressive/H-host/target/lib/libc.a).
|
||||
3) make the change to reloc.c
|
||||
4) rebuild the linker
|
||||
5) repeat step 2
|
||||
6) if the resulting object files are the same, you have at least
|
||||
made it no worse
|
||||
7) if they are different you have to figure out which version is
|
||||
right
|
||||
*/
|
||||
The problem with removing the line is just that it may break
|
||||
some working code. With BFD it's hard to be sure of anything.
|
||||
The right way to deal with this is simply to build and test at
|
||||
least all the supported COFF targets. It should be
|
||||
straightforward if time and disk space consuming. For each
|
||||
target:
|
||||
1) build the linker
|
||||
2) generate some executable, and link it using -r (I would
|
||||
probably use paranoia.o and link against newlib/libc.a,
|
||||
which for all the supported targets would be available in
|
||||
/usr/cygnus/progressive/H-host/target/lib/libc.a).
|
||||
3) make the change to reloc.c
|
||||
4) rebuild the linker
|
||||
5) repeat step 2
|
||||
6) if the resulting object files are the same, you have at
|
||||
least made it no worse
|
||||
7) if they are different you have to figure out which
|
||||
version is right. */
|
||||
relocation -= reloc_entry->addend;
|
||||
#endif
|
||||
reloc_entry->addend = 0;
|
||||
@ -462,11 +452,9 @@ space consuming. For each target:
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
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
|
||||
any room in the output format to describe addends to relocs)
|
||||
*/
|
||||
/* 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
|
||||
any room in the output format to describe addends to relocs). */
|
||||
|
||||
/* The cast to bfd_vma avoids a bug in the Alpha OSF/1 C compiler
|
||||
(OSF version 1.3, compiler version 3.11). It miscompiles the
|
||||
@ -493,11 +481,10 @@ space consuming. For each target:
|
||||
|
||||
relocation >>= (bfd_vma) howto->rightshift;
|
||||
|
||||
/* Shift everything up to where it's going to be used */
|
||||
|
||||
/* Shift everything up to where it's going to be used. */
|
||||
relocation <<= (bfd_vma) howto->bitpos;
|
||||
|
||||
/* Wait for the day when all have the mask in them */
|
||||
/* Wait for the day when all have the mask in them. */
|
||||
|
||||
/* What we do:
|
||||
i instruction to be left alone
|
||||
@ -527,8 +514,7 @@ space consuming. For each target:
|
||||
B B B B B
|
||||
or A A A A A
|
||||
-----------------------
|
||||
R R R R R R R R R R put into bfd_put<size>
|
||||
*/
|
||||
R R R R R R R R R R put into bfd_put<size>. */
|
||||
|
||||
#define DOIT(x) \
|
||||
x = ( (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask))
|
||||
@ -538,39 +524,39 @@ space consuming. For each target:
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
char x = get_data (location, 1);
|
||||
bfd_vma x = get_data (location, 1);
|
||||
DOIT (x);
|
||||
overflow = put_data ((bfd_vma) x, location, 1);
|
||||
put_data ((bfd_vma) x, location, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
if (relocation)
|
||||
{
|
||||
short x = get_data (location, 2);
|
||||
bfd_vma x = get_data (location, 2);
|
||||
DOIT (x);
|
||||
overflow = put_data ((bfd_vma) x, location, 2);
|
||||
put_data ((bfd_vma) x, location, 2);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (relocation)
|
||||
{
|
||||
long x = get_data (location, 4);
|
||||
bfd_vma x = get_data (location, 4);
|
||||
DOIT (x);
|
||||
overflow = put_data ((bfd_vma) x, location, 4);
|
||||
put_data ((bfd_vma) x, location, 4);
|
||||
}
|
||||
break;
|
||||
case -2:
|
||||
{
|
||||
long x = get_data (location, 4);
|
||||
bfd_vma x = get_data (location, 4);
|
||||
relocation = -relocation;
|
||||
DOIT(x);
|
||||
overflow = put_data ((bfd_vma) x, location, 4);
|
||||
put_data ((bfd_vma) x, location, 4);
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
/* Do nothing */
|
||||
/* Do nothing. */
|
||||
break;
|
||||
|
||||
case 4:
|
||||
@ -579,7 +565,7 @@ space consuming. For each target:
|
||||
{
|
||||
bfd_vma x = get_data (location, 8);
|
||||
DOIT (x);
|
||||
overflow = put_data (x, location, 8);
|
||||
put_data (x, location, 8);
|
||||
}
|
||||
#else
|
||||
abort ();
|
||||
@ -604,7 +590,7 @@ _bfd_do_ns32k_reloc_contents (howto, input_bfd, relocation, location,
|
||||
bfd_vma relocation;
|
||||
bfd_byte *location;
|
||||
bfd_vma (*get_data) PARAMS ((bfd_byte *, int));
|
||||
int (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
|
||||
void (*put_data) PARAMS ((bfd_vma, bfd_byte *, int));
|
||||
{
|
||||
int size;
|
||||
bfd_vma x;
|
||||
|
32
bfd/ns32k.h
32
bfd/ns32k.h
@ -1,22 +1,22 @@
|
||||
/* Header file for ns32k routines.
|
||||
Copyright 1996, 2001 Free Software Foundation, Inc.
|
||||
Copyright 1996, 2001, 2002 Free Software Foundation, Inc.
|
||||
Written by Cygnus Support.
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
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 2 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.
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
extern bfd_reloc_status_type _bfd_ns32k_relocate_contents
|
||||
PARAMS ((reloc_howto_type *, bfd *, bfd_vma, bfd_byte *));
|
||||
@ -24,7 +24,7 @@ extern bfd_reloc_status_type _bfd_ns32k_relocate_contents
|
||||
extern bfd_reloc_status_type _bfd_do_ns32k_reloc_contents
|
||||
PARAMS ((reloc_howto_type *, bfd *, bfd_vma, bfd_byte *,
|
||||
bfd_vma (*) (bfd_byte *, int),
|
||||
int (*) (bfd_vma, bfd_byte *, int)));
|
||||
void (*) (bfd_vma, bfd_byte *, int)));
|
||||
|
||||
extern bfd_reloc_status_type _bfd_ns32k_final_link_relocate
|
||||
PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, bfd_vma,
|
||||
@ -32,8 +32,8 @@ extern bfd_reloc_status_type _bfd_ns32k_final_link_relocate
|
||||
|
||||
extern bfd_vma _bfd_ns32k_get_displacement PARAMS ((bfd_byte *, int));
|
||||
extern bfd_vma _bfd_ns32k_get_immediate PARAMS ((bfd_byte *, int));
|
||||
extern int _bfd_ns32k_put_displacement PARAMS ((bfd_vma, bfd_byte *, int));
|
||||
extern int _bfd_ns32k_put_immediate PARAMS ((bfd_vma, bfd_byte *, int));
|
||||
extern void _bfd_ns32k_put_displacement PARAMS ((bfd_vma, bfd_byte *, int));
|
||||
extern void _bfd_ns32k_put_immediate PARAMS ((bfd_vma, bfd_byte *, int));
|
||||
|
||||
extern bfd_reloc_status_type _bfd_ns32k_reloc_disp
|
||||
PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
|
||||
|
@ -1,3 +1,31 @@
|
||||
2002-07-31 Ian Dall <ian@sibyl.beware.dropbear.id.au>
|
||||
|
||||
* config/tc-ns32k.h (md_pcrel_adjust): Supply prototype.
|
||||
* config/tc-ns32k.c (convert_iif, md_parse_option, md_show_usage):
|
||||
Allow default displacement size to be an option "--disp-size-default".
|
||||
(md_number_to_disp): Make error messages include value. Use %d to
|
||||
print integers, not %s.
|
||||
(fix_new_ns32k): Conditionally set fx_no_overflow so we don't
|
||||
get duplicate messages sometimes.
|
||||
(convert_iif): Grow frag to max possible instruction size. Avoid
|
||||
creating unnecessary fixes.
|
||||
(md_number_to_field) Add prototype.
|
||||
(encode_operand, parse, convert_iif, md_fix_pcrel_adjust): Add
|
||||
prototypes and make static.
|
||||
(struct addr_mode): Make mode and scaled_mode explicitly signed.
|
||||
(evaluate_expr): Use resultP argument instead of exprP global.
|
||||
(get_addr_mode): Quiten compiler warnings.
|
||||
(encode_operand): eliminate unused variables. Quiten compiler
|
||||
warnings. Eliminate nul character in format strings.
|
||||
(parse): argc is unsigned.
|
||||
(reloc): Type cast index to quieten compiler.
|
||||
(md_pcrel_adjust, md_apply_fix3): Remove unused variable.
|
||||
(md_convert_frag): Note unused parameters. Remove unused
|
||||
variables.
|
||||
(md_create_long_jump, md_create_short_jump,
|
||||
md_undefined_symbol_name, md_section_align, tc_gen_reloc): Note
|
||||
unused parameters.
|
||||
|
||||
2002-07-31 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* NEWS: Retroactively add entry for Lars Brinkhoff's contribution
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/* tc-ns32k.h -- Opcode table for National Semi 32k processor
|
||||
Copyright 1987, 1992, 1993, 1994, 1995, 1997, 2000
|
||||
Copyright 1987, 1992, 1993, 1994, 1995, 1997, 2000, 2002
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GAS, the GNU Assembler.
|
||||
@ -24,6 +24,7 @@
|
||||
#define TARGET_BYTES_BIG_ENDIAN 0
|
||||
|
||||
#define TC_PCREL_ADJUST(F) md_pcrel_adjust(F)
|
||||
extern int md_pcrel_adjust PARAMS((fragS *fragP));
|
||||
|
||||
#ifdef BFD_ASSEMBLER
|
||||
#define NO_RELOC BFD_RELOC_NONE
|
||||
@ -62,35 +63,17 @@
|
||||
#define ARG_LEN 50
|
||||
|
||||
#define TC_CONS_FIX_NEW cons_fix_new_ns32k
|
||||
extern void fix_new_ns32k_exp PARAMS((fragS *frag,
|
||||
int where,
|
||||
int size,
|
||||
expressionS *exp,
|
||||
int pcrel,
|
||||
int im_disp,
|
||||
bit_fixS *bit_fixP, /* really bit_fixS */
|
||||
int bsr,
|
||||
fragS *opcode_frag,
|
||||
unsigned int opcode_offset));
|
||||
extern void fix_new_ns32k_exp PARAMS ((fragS *, int, int, expressionS *,
|
||||
int, int, bit_fixS *, int, fragS *,
|
||||
unsigned int));
|
||||
|
||||
extern void fix_new_ns32k PARAMS ((fragS *frag,
|
||||
int where,
|
||||
int size,
|
||||
symbolS *add_symbol,
|
||||
long offset,
|
||||
int pcrel,
|
||||
int im_disp,
|
||||
bit_fixS *bit_fixP, /* really bit_fixS */
|
||||
int bsr,
|
||||
fragS *opcode_frag,
|
||||
unsigned int opcode_offset));
|
||||
extern void fix_new_ns32k PARAMS ((fragS *, int, int, symbolS *, long,
|
||||
int, int, bit_fixS *, int, fragS *,
|
||||
unsigned int));
|
||||
|
||||
extern void cons_fix_new_ns32k PARAMS ((fragS *frag,
|
||||
int where,
|
||||
int size,
|
||||
expressionS *exp));
|
||||
extern void cons_fix_new_ns32k PARAMS ((fragS *, int, int, expressionS *));
|
||||
|
||||
/* the NS32x32 has a non 0 nop instruction which should be used in aligns */
|
||||
/* The NS32x32 has a non 0 nop instruction which should be used in aligns. */
|
||||
#define NOP_OPCODE 0xa2
|
||||
|
||||
#define md_operand(x)
|
||||
@ -99,33 +82,34 @@ extern const struct relax_type md_relax_table[];
|
||||
#define TC_GENERIC_RELAX_TABLE md_relax_table
|
||||
|
||||
#define TC_FRAG_TYPE \
|
||||
struct { \
|
||||
fragS *fr_opcode_fragP; \
|
||||
unsigned int fr_opcode_offset; \
|
||||
char fr_bsr; \
|
||||
}
|
||||
struct \
|
||||
{ \
|
||||
fragS * fr_opcode_fragP; \
|
||||
unsigned int fr_opcode_offset; \
|
||||
char fr_bsr; \
|
||||
}
|
||||
|
||||
#define TC_FRAG_INIT(X) \
|
||||
do \
|
||||
{ \
|
||||
frag_opcode_frag (X) = NULL; \
|
||||
frag_opcode_offset (X) = 0; \
|
||||
frag_bsr (X) = 0; \
|
||||
frag_bsr (X) = 0; \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
/* Accessor macros for things which may move around */
|
||||
/* Accessor macros for things which may move around. */
|
||||
#define frag_opcode_frag(X) (X)->tc_frag_data.fr_opcode_fragP
|
||||
#define frag_opcode_offset(X) (X)->tc_frag_data.fr_opcode_offset
|
||||
#define frag_bsr(X) (X)->tc_frag_data.fr_bsr
|
||||
|
||||
#define TC_FIX_TYPE \
|
||||
struct \
|
||||
{ \
|
||||
fragS *opcode_fragP; \
|
||||
unsigned int opcode_offset; \
|
||||
unsigned int bsr : 1; \
|
||||
}
|
||||
struct \
|
||||
{ \
|
||||
fragS * opcode_fragP; \
|
||||
unsigned int opcode_offset; \
|
||||
unsigned int bsr : 1; \
|
||||
}
|
||||
|
||||
/* Accessor macros for things which may move around.
|
||||
See comments in write.h. */
|
||||
|
Loading…
Reference in New Issue
Block a user