This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: QNX MIPS Support Patch
- From: Jeff Baker <jbaker at qnx dot com>
- To: jbaker at qnx dot com
- Cc: Thiemo Seufer <ica2_ts at csv dot ica dot uni-stuttgart dot de>, binutils at sources dot redhat dot com
- Date: Thu, 26 Aug 2004 15:14:43 -0400
- Subject: Re: QNX MIPS Support Patch
- Organization: QNX Software Systems Ltd.
- References: <412E2DB7.4030803@qnx.com>
- Reply-to: jbaker at qnx dot com
Here are two patches to start.
qnx_copy_rel.patch - This adds the R_MIPS_QNX_COPY reloc. I left out
the handling of that reloc in the BFD for a different patch.
qnx_shared_textrel.patch - This patch adds the --warn-shared-textrel
option to the linker. This option, oddly enough, warns when a
DT_TEXTREL is being added to a shared object.
Still to come:
- A patch to add general understanding of QNX MIPS as a target.
- A patch to add QNX MIPS PIC handling to gas.
- A patch to add support for QNX MIPS PIC to the BFD. This patch is the
one with all the #ifdef __QNXTARGET__ 's and I need some help in
figuring out the proper way to implement it.
I think that should cover it.
Jeff Baker wrote:
Strange. That message never showed up in my inbox. I'll take a look,
thanks.
Thiemo Seufer wrote:
Jeff Baker wrote:
I know it's huge, but has anyone gotten a chance to take a quick look
at
this?
Well, I mailed my quick look in
http://sources.redhat.com/ml/binutils/2004-08/msg00221.html
As said there, I don't like the #ifdef __QNXTARGET__ stuff, it
will produce "interesting" results for --enable-targets=all.
Thiemo
Index: elflink.c
===================================================================
RCS file: /cvs/src/src/bfd/elflink.c,v
retrieving revision 1.98
diff -w -u -1 -0 -p -r1.98 elflink.c
--- elflink.c 21 Aug 2004 01:13:22 -0000 1.98
+++ elflink.c 26 Aug 2004 19:05:05 -0000
@@ -2650,20 +2650,25 @@ _bfd_elf_add_dynamic_entry (struct bfd_l
const struct elf_backend_data *bed;
asection *s;
bfd_size_type newsize;
bfd_byte *newcontents;
Elf_Internal_Dyn dyn;
hash_table = elf_hash_table (info);
if (! is_elf_hash_table (hash_table))
return FALSE;
+ if (info->warn_shared_textrel && info->shared && tag == DT_TEXTREL) {
+ (*_bfd_error_handler)
+ (_("warning: creating a DT_TEXTREL in a shared object."));
+ }
+
bed = get_elf_backend_data (hash_table->dynobj);
s = bfd_get_section_by_name (hash_table->dynobj, ".dynamic");
BFD_ASSERT (s != NULL);
newsize = s->size + bed->s->sizeof_dyn;
newcontents = bfd_realloc (s->contents, newsize);
if (newcontents == NULL)
return FALSE;
dyn.d_tag = tag;
Index: bfdlink.h
===================================================================
RCS file: /cvs/src/src/include/bfdlink.h,v
retrieving revision 1.45
diff -w -u -1 -0 -p -r1.45 bfdlink.h
--- bfdlink.h 13 Aug 2004 03:16:01 -0000 1.45
+++ bfdlink.h 26 Aug 2004 19:05:31 -0000
@@ -390,20 +390,23 @@ struct bfd_link_info
unsigned int spare_dynamic_tags;
/* May be used to set DT_FLAGS for ELF. */
bfd_vma flags;
/* May be used to set DT_FLAGS_1 for ELF. */
bfd_vma flags_1;
/* Start and end of RELRO region. */
bfd_vma relro_start, relro_end;
+
+ /* Warn if adding a DT_TEXTREL to a shared object. */
+ bfd_boolean warn_shared_textrel;
};
/* This structures holds a set of callback functions. These are
called by the BFD linker routines. The first argument to each
callback function is the bfd_link_info structure being used. Each
function returns a boolean value. If the function returns FALSE,
then the BFD function which called it will return with a failure
indication. */
struct bfd_link_callbacks
Index: lexsup.c
===================================================================
RCS file: /cvs/src/src/ld/lexsup.c,v
retrieving revision 1.76
diff -w -u -1 -0 -p -r1.76 lexsup.c
--- lexsup.c 19 Jul 2004 16:40:52 -0000 1.76
+++ lexsup.c 26 Aug 2004 19:05:45 -0000
@@ -139,21 +139,22 @@ enum option_values
OPTION_NOSTDLIB,
OPTION_NO_OMAGIC,
OPTION_STRIP_DISCARDED,
OPTION_NO_STRIP_DISCARDED,
OPTION_ACCEPT_UNKNOWN_INPUT_ARCH,
OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH,
OPTION_PIE,
OPTION_UNRESOLVED_SYMBOLS,
OPTION_WARN_UNRESOLVED_SYMBOLS,
OPTION_ERROR_UNRESOLVED_SYMBOLS,
- OPTION_REDUCE_MEMORY_OVERHEADS
+ OPTION_REDUCE_MEMORY_OVERHEADS,
+ OPTION_WARN_SHARED_TEXTREL
};
/* The long options. This structure is used for both the option
parsing and the help text. */
struct ld_option
{
/* The long option information. */
struct option opt;
/* The short option with the same meaning ('\0' if none). */
@@ -489,20 +490,23 @@ static const struct ld_option ld_options
"\t\t\t\tfollowing dynamic libs"), TWO_DASHES },
{ {"no-add-needed", no_argument, NULL, OPTION_NO_ADD_NEEDED},
'\0', NULL, N_("Do not set DT_NEEDED tags for DT_NEEDED entries\n"
"\t\t\t\tin following dynamic libs"), TWO_DASHES },
{ {"as-needed", no_argument, NULL, OPTION_AS_NEEDED},
'\0', NULL, N_("Only set DT_NEEDED for following dynamic libs if used"),
TWO_DASHES },
{ {"no-as-needed", no_argument, NULL, OPTION_NO_AS_NEEDED},
'\0', NULL, N_("Always set DT_NEEDED for following dynamic libs"),
TWO_DASHES },
+ { {"warn-shared-textrel", no_argument, NULL, OPTION_WARN_SHARED_TEXTREL},
+ '\0', NULL, N_("Warn if shared object has DT_TEXTREL"),
+ TWO_DASHES },
{ {"wrap", required_argument, NULL, OPTION_WRAP},
'\0', N_("SYMBOL"), N_("Use wrapper functions for SYMBOL"), TWO_DASHES },
};
#define OPTION_COUNT ARRAY_SIZE (ld_options)
void
parse_args (unsigned argc, char **argv)
{
unsigned i;
@@ -1209,20 +1213,23 @@ parse_args (unsigned argc, char **argv)
break;
case OPTION_NO_ADD_NEEDED:
add_needed = FALSE;
break;
case OPTION_AS_NEEDED:
as_needed = TRUE;
break;
case OPTION_NO_AS_NEEDED:
as_needed = FALSE;
break;
+ case OPTION_WARN_SHARED_TEXTREL:
+ link_info.warn_shared_textrel = TRUE;
+ break;
case OPTION_WRAP:
add_wrap (optarg);
break;
case OPTION_DISCARD_NONE:
link_info.discard = discard_none;
break;
case 'X':
link_info.discard = discard_l;
break;
case 'x':
Index: bfd/bfd-in2.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in2.h,v
retrieving revision 1.297
diff -w -u -1 -0 -p -r1.297 bfd-in2.h
--- bfd/bfd-in2.h 25 Aug 2004 12:54:13 -0000 1.297
+++ bfd/bfd-in2.h 26 Aug 2004 18:46:21 -0000
@@ -2361,20 +2361,21 @@ to compensate for the borrow when the lo
BFD_RELOC_MIPS_SHIFT6,
BFD_RELOC_MIPS_INSERT_A,
BFD_RELOC_MIPS_INSERT_B,
BFD_RELOC_MIPS_DELETE,
BFD_RELOC_MIPS_HIGHEST,
BFD_RELOC_MIPS_HIGHER,
BFD_RELOC_MIPS_SCN_DISP,
BFD_RELOC_MIPS_REL16,
BFD_RELOC_MIPS_RELGOT,
BFD_RELOC_MIPS_JALR,
+ BFD_RELOC_MIPS_QNX_COPY,
/* Fujitsu Frv Relocations. */
BFD_RELOC_FRV_LABEL16,
BFD_RELOC_FRV_LABEL24,
BFD_RELOC_FRV_LO16,
BFD_RELOC_FRV_HI16,
BFD_RELOC_FRV_GPREL12,
BFD_RELOC_FRV_GPRELU12,
BFD_RELOC_FRV_GPREL32,
Index: bfd/elf32-mips.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-mips.c,v
retrieving revision 1.178
diff -w -u -1 -0 -p -r1.178 elf32-mips.c
--- bfd/elf32-mips.c 29 Jun 2004 13:46:30 -0000 1.178
+++ bfd/elf32-mips.c 26 Aug 2004 18:46:21 -0000
@@ -592,20 +592,41 @@ static reloc_howto_type elf_mips16_gprel
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
mips16_gprel_reloc, /* special_function */
"R_MIPS16_GPREL", /* name */
TRUE, /* partial_inplace */
0x07ff001f, /* src_mask */
0x07ff001f, /* dst_mask */
FALSE); /* pcrel_offset */
+/* Do a QNX pic copy relocation. This is used only with dynamic linking.
+ This works in the same way as copy relocs on other platforms: the data
+ object must exist both in the object and in the shared lib. The dynamic
+ linker copies the data from the shared object to the executable at runtime.
+ This is needed because the exec. does not access the data through the GOT.
+ */
+static reloc_howto_type elf_mips_qnx_copy_howto =
+ HOWTO (R_MIPS_QNX_COPY, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ FALSE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_MIPS_QNX_COPY", /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0, /* dst_mask */
+ FALSE); /* pcrel_offset */
+
/* 16 bit offset for pc-relative branches. */
static reloc_howto_type elf_mips_gnu_rel16_s2 =
HOWTO (R_MIPS_GNU_REL16_S2, /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
_bfd_mips_elf_generic_reloc, /* special_function */
@@ -1039,21 +1060,22 @@ static const struct elf_reloc_map mips_r
{ BFD_RELOC_16_PCREL, R_MIPS_PC16 },
{ BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
{ BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
{ BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
{ BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
{ BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
{ BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
{ BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
{ BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
{ BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
- { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP }
+ { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
+ { BFD_RELOC_MIPS_QNX_COPY, R_MIPS_QNX_COPY }
};
/* Given a BFD reloc type, return a howto structure. */
static reloc_howto_type *
bfd_elf32_bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
{
unsigned int i;
reloc_howto_type *howto_table = elf_mips_howto_table_rel;
Index: bfd/libbfd.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd.h,v
retrieving revision 1.122
diff -w -u -1 -0 -p -r1.122 libbfd.h
--- bfd/libbfd.h 25 Aug 2004 12:54:14 -0000 1.122
+++ bfd/libbfd.h 26 Aug 2004 18:46:22 -0000
@@ -912,21 +912,21 @@ static const char *const bfd_reloc_code_
"BFD_RELOC_MIPS_SHIFT6",
"BFD_RELOC_MIPS_INSERT_A",
"BFD_RELOC_MIPS_INSERT_B",
"BFD_RELOC_MIPS_DELETE",
"BFD_RELOC_MIPS_HIGHEST",
"BFD_RELOC_MIPS_HIGHER",
"BFD_RELOC_MIPS_SCN_DISP",
"BFD_RELOC_MIPS_REL16",
"BFD_RELOC_MIPS_RELGOT",
"BFD_RELOC_MIPS_JALR",
-
+ "BFD_RELOC_MIPS_QNX_COPY",
"BFD_RELOC_FRV_LABEL16",
"BFD_RELOC_FRV_LABEL24",
"BFD_RELOC_FRV_LO16",
"BFD_RELOC_FRV_HI16",
"BFD_RELOC_FRV_GPREL12",
"BFD_RELOC_FRV_GPRELU12",
"BFD_RELOC_FRV_GPREL32",
"BFD_RELOC_FRV_GPRELHI",
"BFD_RELOC_FRV_GPRELLO",
"BFD_RELOC_FRV_GOT12",
Index: bfd/reloc.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc.c,v
retrieving revision 1.111
diff -w -u -1 -0 -p -r1.111 reloc.c
--- bfd/reloc.c 25 Aug 2004 12:54:14 -0000 1.111
+++ bfd/reloc.c 26 Aug 2004 18:46:22 -0000
@@ -2105,20 +2105,22 @@ ENUMX
ENUMX
BFD_RELOC_MIPS_HIGHER
ENUMX
BFD_RELOC_MIPS_SCN_DISP
ENUMX
BFD_RELOC_MIPS_REL16
ENUMX
BFD_RELOC_MIPS_RELGOT
ENUMX
BFD_RELOC_MIPS_JALR
+ENUMX
+ BFD_RELOC_MIPS_QNX_COPY
ENUMDOC
MIPS ELF relocations.
COMMENT
ENUM
BFD_RELOC_FRV_LABEL16
ENUMX
BFD_RELOC_FRV_LABEL24
ENUMX
BFD_RELOC_FRV_LO16
Index: include/elf/mips.h
===================================================================
RCS file: /cvs/src/src/include/elf/mips.h,v
retrieving revision 1.23
diff -w -u -1 -0 -p -r1.23 mips.h
--- include/elf/mips.h 14 Jun 2004 18:25:10 -0000 1.23
+++ include/elf/mips.h 26 Aug 2004 18:46:24 -0000
@@ -69,20 +69,22 @@ START_RELOC_NUMBERS (elf_mips_reloc_type
RELOC_NUMBER (R_MIPS_SCN_DISP, 32)
RELOC_NUMBER (R_MIPS_REL16, 33)
RELOC_NUMBER (R_MIPS_ADD_IMMEDIATE, 34)
RELOC_NUMBER (R_MIPS_PJUMP, 35)
RELOC_NUMBER (R_MIPS_RELGOT, 36)
RELOC_NUMBER (R_MIPS_JALR, 37)
RELOC_NUMBER (R_MIPS_max, 38)
/* These relocs are used for the mips16. */
RELOC_NUMBER (R_MIPS16_26, 100)
RELOC_NUMBER (R_MIPS16_GPREL, 101)
+ /* And this is used with QNX pic for data copy relocs */
+ RELOC_NUMBER (R_MIPS_QNX_COPY, 126)
/* This was a GNU extension used by embedded-PIC. It was co-opted by
mips-linux for exception-handling data. It is no longer used, but
should continue to be supported by the linker for backward
compatibility. (GCC stopped using it in May, 2004.) */
RELOC_NUMBER (R_MIPS_PC32, 248)
/* FIXME: this relocation is used internally by gas. */
RELOC_NUMBER (R_MIPS_GNU_REL16_S2, 250)
/* These are GNU extensions to enable C++ vtable garbage collection. */
RELOC_NUMBER (R_MIPS_GNU_VTINHERIT, 253)
RELOC_NUMBER (R_MIPS_GNU_VTENTRY, 254)