From 0242cd5697001c82a49d0148463b3083a0d56667 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 11 Jun 1994 20:39:54 +0000 Subject: [PATCH] Add weak symbols as an extension to a.out. * aout64.h (N_WEAKU, N_WEAKA, N_WEAKT, N_WEAKD, N_WEAKB): Define. * stab.def: Update symbol value table. --- include/aout/ChangeLog | 22 +++++++++-- include/aout/aout64.h | 85 +++++++++++++++++++++++++++++------------- 2 files changed, 79 insertions(+), 28 deletions(-) diff --git a/include/aout/ChangeLog b/include/aout/ChangeLog index 2b3382474c..1519efbc08 100644 --- a/include/aout/ChangeLog +++ b/include/aout/ChangeLog @@ -1,3 +1,18 @@ +Sat Jun 11 16:16:09 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + Add weak symbols as an extension to a.out. + * aout64.h (N_WEAKU, N_WEAKA, N_WEAKT, N_WEAKD, N_WEAKB): Define. + * stab.def: Update symbol value table. + +Thu Jun 2 17:13:38 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * sun4.h (EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE): Correct from 28 to + 24. Fix up ld_got comment. + +Wed Mar 30 00:31:49 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * dynix3.h: Cleanup, adapt to current bfd version. + Sat Feb 26 10:25:53 1994 Ian Lance Taylor (ian@cygnus.com) * aout64.h: Add casts to avoid warnings from SVR4 cc. @@ -128,6 +143,7 @@ Sat Nov 30 20:34:52 1991 Steve Chamberlain (sac at rtl.cygnus.com) reloc.h, stab.def, stab_gnu.h, sun4.h: All moved from the devo/include directory - - - + +Local Variables: +version-control: never +End: diff --git a/include/aout/aout64.h b/include/aout/aout64.h index 8f61377bbe..f96f856172 100644 --- a/include/aout/aout64.h +++ b/include/aout/aout64.h @@ -38,7 +38,7 @@ struct external_exec #define ZMAGIC 0413 /* Code indicating demand-paged executable. */ /* This indicates a demand-paged executable with the header in the text. - As far as I know it is only used by 386BSD and/or BSDI. */ + It is used by 386BSD (and variants) and Linux, at least. */ #define QMAGIC 0314 # ifndef N_BADMAG # define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ @@ -121,6 +121,11 @@ struct external_exec #define N_SHARED_LIB(x) ((x).a_entry < TEXT_START_ADDR) #endif +/* Returning 0 not TEXT_START_ADDR for OMAGIC and NMAGIC is based on + the assumption that we are dealing with a .o file, not an + executable. This is necessary for OMAGIC (but means we don't work + right on the output from ld -N); more questionable for NMAGIC. */ + #ifndef N_TXTADDR #define N_TXTADDR(x) \ (/* The address of a QMAGIC file is always one page in, */ \ @@ -134,6 +139,19 @@ struct external_exec ) #endif +/* If N_HEADER_IN_TEXT is not true for ZMAGIC, there is some padding + to make the text segment start at a certain boundary. For most + systems, this boundary is PAGE_SIZE. But for Linux, in the + time-honored tradition of crazy ZMAGIC hacks, it is 1024 which is + not what PAGE_SIZE needs to be for QMAGIC. */ + +#ifndef ZMAGIC_DISK_BLOCK_SIZE +#define ZMAGIC_DISK_BLOCK_SIZE PAGE_SIZE +#endif + +#define N_DISK_BLOCK_SIZE(x) \ + (N_MAGIC(x) == ZMAGIC ? ZMAGIC_DISK_BLOCK_SIZE : PAGE_SIZE) + /* Offset in an a.out of the start of the text section. */ #ifndef N_TXTOFF #define N_TXTOFF(x) \ @@ -142,7 +160,7 @@ struct external_exec N_SHARED_LIB(x) ? 0 : \ N_HEADER_IN_TEXT(x) ? \ EXEC_BYTES_SIZE : /* no padding */\ - PAGE_SIZE /* a page of padding */\ + ZMAGIC_DISK_BLOCK_SIZE /* a page of padding */\ ) #endif /* Size of the text section. It's always as stated, except that we @@ -174,15 +192,21 @@ struct external_exec /* Offsets of the various portions of the file after the text segment. */ -/* For {N,Q,Z}MAGIC, there is padding to make the data segment start - on a page boundary. Most of the time the a_text field (and thus - N_TXTSIZE) already contains this padding. But if it doesn't (I - think maybe this happens on BSDI and/or 386BSD), then add it. */ +/* For {Q,Z}MAGIC, there is padding to make the data segment start on + a page boundary. Most of the time the a_text field (and thus + N_TXTSIZE) already contains this padding. It is possible that for + BSDI and/or 386BSD it sometimes doesn't contain the padding, and + perhaps we should be adding it here. But this seems kind of + questionable and probably should be BSDI/386BSD-specific if we do + do it. + + For NMAGIC (at least for hp300 BSD, probably others), there is + padding in memory only, not on disk, so we must *not* ever pad here + for NMAGIC. */ #ifndef N_DATOFF #define N_DATOFF(x) \ - (N_MAGIC(x) == OMAGIC ? N_TXTOFF(x) + N_TXTSIZE(x) : \ - PAGE_SIZE + ((N_TXTOFF(x) + N_TXTSIZE(x) - 1) & ~(PAGE_SIZE - 1))) + (N_TXTOFF(x) + N_TXTSIZE(x)) #endif #ifndef N_TRELOFF @@ -263,6 +287,17 @@ struct internal_nlist { #define N_WARNING 0x1e +/* Weak symbols. These are a GNU extension to the a.out format. The + semantics are those of ELF weak symbols. Weak symbols are always + externally visible. The N_WEAK? values are squeezed into the + available slots. The value of a N_WEAKU symbol is 0. The values + of the other types are the definitions. */ +#define N_WEAKU 0x0d /* Weak undefined symbol. */ +#define N_WEAKA 0x0e /* Weak absolute symbol. */ +#define N_WEAKT 0x0f /* Weak text symbol. */ +#define N_WEAKD 0x10 /* Weak data symbol. */ +#define N_WEAKB 0x11 /* Weak bss symbol. */ + /* Relocations There are two types of relocation flavours for a.out systems, @@ -286,25 +321,25 @@ struct reloc_std_external { bfd_byte r_type[1]; /* relocation type */ }; -#define RELOC_STD_BITS_PCREL_BIG 0x80 -#define RELOC_STD_BITS_PCREL_LITTLE 0x01 +#define RELOC_STD_BITS_PCREL_BIG ((unsigned int) 0x80) +#define RELOC_STD_BITS_PCREL_LITTLE ((unsigned int) 0x01) -#define RELOC_STD_BITS_LENGTH_BIG 0x60 -#define RELOC_STD_BITS_LENGTH_SH_BIG 5 /* To shift to units place */ -#define RELOC_STD_BITS_LENGTH_LITTLE 0x06 +#define RELOC_STD_BITS_LENGTH_BIG ((unsigned int) 0x60) +#define RELOC_STD_BITS_LENGTH_SH_BIG 5 +#define RELOC_STD_BITS_LENGTH_LITTLE ((unsigned int) 0x06) #define RELOC_STD_BITS_LENGTH_SH_LITTLE 1 -#define RELOC_STD_BITS_EXTERN_BIG 0x10 -#define RELOC_STD_BITS_EXTERN_LITTLE 0x08 +#define RELOC_STD_BITS_EXTERN_BIG ((unsigned int) 0x10) +#define RELOC_STD_BITS_EXTERN_LITTLE ((unsigned int) 0x08) -#define RELOC_STD_BITS_BASEREL_BIG 0x08 -#define RELOC_STD_BITS_BASEREL_LITTLE 0x10 +#define RELOC_STD_BITS_BASEREL_BIG ((unsigned int) 0x08) +#define RELOC_STD_BITS_BASEREL_LITTLE ((unsigned int) 0x10) -#define RELOC_STD_BITS_JMPTABLE_BIG 0x04 -#define RELOC_STD_BITS_JMPTABLE_LITTLE 0x04 +#define RELOC_STD_BITS_JMPTABLE_BIG ((unsigned int) 0x04) +#define RELOC_STD_BITS_JMPTABLE_LITTLE ((unsigned int) 0x20) -#define RELOC_STD_BITS_RELATIVE_BIG 0x02 -#define RELOC_STD_BITS_RELATIVE_LITTLE 0x02 +#define RELOC_STD_BITS_RELATIVE_BIG ((unsigned int) 0x02) +#define RELOC_STD_BITS_RELATIVE_LITTLE ((unsigned int) 0x40) #define RELOC_STD_SIZE (BYTES_IN_WORD + 3 + 1) /* Bytes per relocation entry */ @@ -346,12 +381,12 @@ struct reloc_ext_external { bfd_byte r_addend[BYTES_IN_WORD]; /* datum addend */ }; -#define RELOC_EXT_BITS_EXTERN_BIG 0x80 -#define RELOC_EXT_BITS_EXTERN_LITTLE 0x01 +#define RELOC_EXT_BITS_EXTERN_BIG ((unsigned int) 0x80) +#define RELOC_EXT_BITS_EXTERN_LITTLE ((unsigned int) 0x01) -#define RELOC_EXT_BITS_TYPE_BIG 0x1F +#define RELOC_EXT_BITS_TYPE_BIG ((unsigned int) 0x1F) #define RELOC_EXT_BITS_TYPE_SH_BIG 0 -#define RELOC_EXT_BITS_TYPE_LITTLE 0xF8 +#define RELOC_EXT_BITS_TYPE_LITTLE ((unsigned int) 0xF8) #define RELOC_EXT_BITS_TYPE_SH_LITTLE 3 /* Bytes per relocation entry */