summaryrefslogtreecommitdiffstats
path: root/gnu
diff options
context:
space:
mode:
authorjdp <jdp@FreeBSD.org>1998-04-07 17:10:01 +0000
committerjdp <jdp@FreeBSD.org>1998-04-07 17:10:01 +0000
commit4bc4bc7c1a8513f44d4973b99d18eb307c6f0370 (patch)
tree88df5192515c1b5f2097132f9f76d873e8d65d47 /gnu
parent0c131782a5ffeb6413a584cd6c2f7ccdfd5cbaf9 (diff)
downloadFreeBSD-src-4bc4bc7c1a8513f44d4973b99d18eb307c6f0370.zip
FreeBSD-src-4bc4bc7c1a8513f44d4973b99d18eb307c6f0370.tar.gz
Fix a bug which clobbered linker set symbols that had forward references.
With -O3, egcs generates such forward references. PR: gnu/6055 Reviewed by: jdp Submitted by: Dmitrij Tejblum <tejblum@arc.hq.cti.ru> in slightly different form
Diffstat (limited to 'gnu')
-rw-r--r--gnu/usr.bin/as/config/obj-aout.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/gnu/usr.bin/as/config/obj-aout.c b/gnu/usr.bin/as/config/obj-aout.c
index 8aaa7d7..860d904 100644
--- a/gnu/usr.bin/as/config/obj-aout.c
+++ b/gnu/usr.bin/as/config/obj-aout.c
@@ -469,8 +469,24 @@ object_headers *headers;
/* JF deal with forward references first... */
for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next(symbolP)) {
if (symbolP->sy_forward && symbolP->sy_forward != symbolP) {
- S_SET_SEGMENT(symbolP,
- S_GET_SEGMENT(symbolP->sy_forward));
+ switch (S_GET_TYPE(symbolP)) {
+
+ case N_SETA:
+ case N_SETT:
+ case N_SETD:
+ case N_SETB:
+ /*
+ * Don't change the segments of SET symbols,
+ * because that would turn them into regular
+ * symbols.
+ */
+ break;
+
+ default:
+ S_SET_SEGMENT(symbolP,
+ S_GET_SEGMENT(symbolP->sy_forward));
+ break;
+ }
S_SET_VALUE(symbolP, S_GET_VALUE(symbolP)
+ S_GET_VALUE(symbolP->sy_forward)
+ symbolP->sy_forward->sy_frag->fr_address);
OpenPOWER on IntegriCloud