This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[committed] Define DIFF_EXPR_OK for HP-UX SOM
- From: "John David Anglin" <dave at hiauly1 dot hia dot nrc dot ca>
- To: binutils at sourceware dot org
- Date: Sun, 7 Sep 2008 21:02:16 -0400 (EDT)
- Subject: [committed] Define DIFF_EXPR_OK for HP-UX SOM
The enclosed change defines DIFF_EXPR_OK on the HP-UX SOM target.
The trick to successfully defining DIFF_EXPR_OK is to also define
TC_FORCE_RELOCATION_SUB_LOCAL to 1.
Tested with many GCC builds, and by hand to see that gas could successfully
assemble a difference of symbols in $CODE$ and $LIT$ with the relocation
local to $LIT$.
Dave
--
J. David Anglin dave.anglin@nrc-cnrc.gc.ca
National Research Council of Canada (613) 990-0752 (FAX: 952-6602)
2008-09-07 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* config/tc-hppa.h (DIFF_EXPR_OK): Define for SOM target. Revise
comment regarding use of difference expressions.
(TC_FORCE_RELOCATION_SUB_LOCAL): Define to 1.
Index: config/tc-hppa.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-hppa.h,v
retrieving revision 1.39
diff -u -3 -p -r1.39 tc-hppa.h
--- config/tc-hppa.h 7 Sep 2008 22:54:54 -0000 1.39
+++ config/tc-hppa.h 8 Sep 2008 00:01:02 -0000
@@ -146,14 +146,23 @@ int hppa_fix_adjustable (struct fix *);
two symbols. This includes the difference of two symbols when
one of them is undefined (this comes up in PIC code generation).
- We don't define DIFF_EXPR_OK because it does the wrong thing if
- the add symbol is undefined and the sub symbol is a symbol in
- the same section as the relocation. We also need some way to
- specialize some code in adjust_reloc_syms. */
+ We allow the difference of two symbols when the subtract symbol is
+ local to the relocation. This is implemented using R_HPPA_COMPLEX.
+
+ This has some limitations. Difference expressions only work between
+ symbols in the same segment/quadrant of a module since the HP dynamic
+ loader relocates the text and data segments independently. Thus, a
+ difference expression can't be used between text and data symbols,
+ or between symbols in different executable modules. */
+#define DIFF_EXPR_OK 1
+#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX) 1
#define UNDEFINED_DIFFERENCE_OK
#endif
#ifdef OBJ_ELF
+
+/* Difference expressions for the 64-bit HP-UX target have the same
+ limitations as those for the 32-bit SOM target. */
#define DIFF_EXPR_OK 1
/* Handle .type psuedo. Given a type string of `millicode', set the