diff options
author | jdp <jdp@FreeBSD.org> | 1998-04-07 17:10:01 +0000 |
---|---|---|
committer | jdp <jdp@FreeBSD.org> | 1998-04-07 17:10:01 +0000 |
commit | 4bc4bc7c1a8513f44d4973b99d18eb307c6f0370 (patch) | |
tree | 88df5192515c1b5f2097132f9f76d873e8d65d47 /gnu | |
parent | 0c131782a5ffeb6413a584cd6c2f7ccdfd5cbaf9 (diff) | |
download | FreeBSD-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.c | 20 |
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); |