From 5f9a2245d8cbdac6cf6f3da81099e68d224e6256 Mon Sep 17 00:00:00 2001 From: David MacKenzie Date: Sat, 7 Aug 1993 22:38:22 +0000 Subject: [PATCH] make target selection fully configurable --- bfd/ChangeLog | 33 +++++++++- bfd/Makefile.in | 12 ++-- bfd/PORTING | 73 +++++++++++++++++++++ bfd/TODO | 60 +++++++---------- bfd/configure.in | 165 ++++++++++++++++++++++++++++++++++++++--------- bfd/targets.c | 51 +++------------ 6 files changed, 275 insertions(+), 119 deletions(-) create mode 100644 bfd/PORTING diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0b5295209a..67f8940ea7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,34 @@ +Sat Aug 7 09:14:21 1993 David J. Mackenzie (djm@thepub.cygnus.com) + + * PORTING, TODO, config/README: Update to reflect below changes. + + * configure.in: Replace MINIMIZE and --with-minimal-bfd with + --with-bfd-targets="target1,target2,..." and the special target + "all" to get the previous default behavior. + Figure out which architecture and backend .o files are needed from + DEFAULT_VECTOR, SELECT_VECS, and SELECT_ARCHITECTURES as set in + the .mt files. Define TDEFAULTS based on them, also. + + * Makefile.in: Remove references to MINIMIZE. + * archures.c, targets.c: Ditto. + + * config/*.mt: Define DEFAULT_VECTOR, SELECT_VECS, and + SELECT_ARCHITECTURES as variables rather than as -D arguments to + TDEFAULTS. + + * config/a29k-coff.mt,alphaosf.mt, i386-sco.mt, i960-bout.mt, + i960-coff.mt (TDEFAULTS): Don't put the default vector in + SELECT_VECS manually; it's automatic now. + + * config/i386-sco.mt (TDEFAULTS): Don't put &sco_core_vec in + SELECT_VECS manually; -DSCO_CORE does it automatically now. + + * config/h8300-coff.mt,h8500-coff.mt,sh-coff.mt,st2000.mt,z8k-coff.mt + (TDEFAULTS): Don't define BFD; not used. + + * config/hppaosf.mh (HDEFINES): Don't define SELECT_ARCHITECTURES; + this is a host, not a target. + Sat Aug 7 05:28:03 1993 Fred Fish (fnf@deneb.cygnus.com) * elfcode.h (elf_object_p): Add comment about what this function @@ -23,7 +54,7 @@ Fri Aug 6 12:00:03 1993 David J. Mackenzie (djm@thepub.cygnus.com) * config/i386isc.mh (ALLOCA), * config/go32.mh (EXTRALIBS): Don't define; not used. * config/solaris2.mh (HDEFINES): Renamed from H_DEFINES. - * config/alphaosf.mt (TDEFINES): alphaosf.mt: Set it, not HDEFINES. + * config/alphaosf.mt (TDEFINES): Set it, not HDEFINES. * config/z8k-coff.mt (CC): Don't define. It's a target, not a host. * config/.Sanitize (Things-to-keep): Add README. diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 0f417f6a17..34546bbdf5 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -107,9 +107,6 @@ OPTIONAL_BACKENDS = trad-core.o sco-core.o aix386-core.o hpux-core.o # These are defined by configure.in: # WORDSIZE=32 # BFD_BACKENDS = $(BFD32_BACKENDS) -# Change this (to MINIMIZE=1) to save space in executables. -# Currently, all this does is control the target_vector in targets.c. -# MINIMIZE=0 all: @@ -177,9 +174,8 @@ install-info: force # Various kinds of .o files to put in libbfd.a: # BFD_LIBS Generic routines, always needed. -# BFD_BACKENDS Routines the target needs if it is the configured target. -# BFD_MACHINES Architecture-specific routines in cpu-*.o. -# Always set to ALL_MACHINES for now. +# BFD_BACKENDS Routines the configured targets need. +# BFD_MACHINES Architecture-specific routines the configured targets need. # HDEPFILES Routines the host needs, regardless of target. # TDEPFILES Routines the target needs, regardless of host. OFILES = $(BFD_LIBS) $(BFD_BACKENDS) $(BFD_MACHINES) $(HDEPFILES) $(TDEPFILES) @@ -206,10 +202,10 @@ $(TARGETLIB): $(OFILES) ofiles targets.o: targets.c Makefile - $(CC) -c $(CFLAGS) $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHES) -DMINIMIZE=$(MINIMIZE) $(TDEFAULTS) $< + $(CC) -c $(CFLAGS) $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHES) $(TDEFAULTS) $< archures.o: archures.c Makefile - $(CC) -c $(CFLAGS) $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHES) -DMINIMIZE=$(MINIMIZE) $(TDEFAULTS) $< + $(CC) -c $(CFLAGS) $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHES) $(TDEFAULTS) $< subdir_do: force @for i in $(DODIRS); do \ diff --git a/bfd/PORTING b/bfd/PORTING new file mode 100644 index 0000000000..d2d4911097 --- /dev/null +++ b/bfd/PORTING @@ -0,0 +1,73 @@ + Preliminary Notes on Porting BFD + -------------------------------- + +The 'host' is the system a tool runs *on*. +The 'target' is the system a tool runs *for*, i.e. +a tool can read/write the binaries of the target. + +Porting to a new host +--------------------- +Pick a name for your host. Call that . +( might be sun4, ...) +Create a file hosts/h-. + +Porting to a new target +----------------------- +Pick a name for your target. Call that . +You need to create .c and config/mt-. + +config/mt- is a Makefile fragment. +The following is usually enough: +DEFAULT_VECTOR=_vec +SELECT_ARCHITECTURES=bfd__arch + +See the list of cpu types in archures.c, or "ls cpu-*.c". + +The file .c is the hard part. It implements the +bfd_target _vec, which includes pointers to +functions that do the actual -specific methods. + +Porting to a that uses the a.out binary format +------------------------------------------------------- + +In this case, the include file aout-target.h probaby does most +of what you need. The program gen-aout generates .c for +you automatically for many a.out systems. Do: + make gen-aout + ./gen-aout > .c +(This only works if you are building on the target ("native"). +If you must make a cross-port from scratch, copy the most +similar existing file that includes aout-target.h, and fix what is wrong.) + +Check the parameters in .c, and fix anything that is wrong. +(Also let us know about it; perhaps we can improve gen-aout.c.) + +TARGET_IS_BIG_ENDIAN_P + Should be defined if is big-endian. + +N_HEADER_IN_TEXT(x) + See discussion in ../include/aout/aout32.h. + +BYTES_IN_WORD + Number of bytes per word. (Usually 4 but can be 8.) + +ARCH + Number of bits per word. (Usually 32, but can be 64.) + +ENTRY_CAN_BE_ZERO + Define if the extry point (start address of an + executable program) can be 0x0. + +TEXT_START_ADDR + The address of the start of the text segemnt in + virtual memory. Normally, the same as the entry point. + +PAGE_SIZE + +SEGMENT_SIZE + Usually, the same as the PAGE_SIZE. + Alignment needed for the data segment. + +TARGETNAME + The name of the target, for run-time lookups. + Usually "a.out-" diff --git a/bfd/TODO b/bfd/TODO index 26fd83b0f7..8d39107fdd 100644 --- a/bfd/TODO +++ b/bfd/TODO @@ -1,41 +1,25 @@ -Things that still need to be handled: -*- Text -*- +Things that still need to be done: -*- Text -*- + + o - A source of space lossage is that all the target-dependent + code is in a single bfd_target structure. Hence all the code + for *writing* object files is still pulled into all the applications + that only care about *reading* (gdb, nm, objdump), while gas + has to carry along all the unneded baggage for reading objects. + And so one. This would be a much more substantial change, + and the payoff would be less (essentially none if bfd is + used as a shared library). + + o - The storage needed by BFD data structures is also larger than strictly + needed. This may be difficult to do much about. - o - change the memory usage to reflect the message which follows the - page break. o - implement bfd_abort, which should close the bfd but not alter the filesystem. - o - update the bfd doc; write a how-to-write-a-backend doc. - o - change reloc handling as per Steve's suggestion. - (more details please.....) - -Changing the way bfd uses memory. The new convention is simple: - - o - bfd will never write into user-supplied memory, nor attempt to - free it. - o - closing a bfd may reclaim all bfd-allocated memory associated - with that bfd. - - - bfd_target_list will be the one exception; you must reclaim the - returned vector yourself. - -Interface implications are minor (get_symcount_upper_bound will go -away; bfd_cannicalize_symtab will allocate its own memory, etc). - -Certain operations consume a lot of memory; for them manual -reclaimation is available: - - o - bfd_canonicalize_symtab will return a pointer to a - null-terminated vector of symbols. Subsequent calls may or may - not return the same pointer. - bfd_canonicalize_relocs will do the same; returning a pointer to - an array of arelocs. Calling this function will read symbols in - too. - - o - bfd_reclaim_relocs will free the memory used by these relocs. - the symbols will be untouched. - bfd_reclaim_symtab (ne bfd_reclaim_symbol_table) will free the - memory allocated by canonialize_symtab. - Since relocations point to symbols, any relocations obtained by a - call to bfd_canonicalize_relocs will be reclaimed as well. - - o - if you don't call the reclaim_ functions, the memory will be - reclaimed at bfd_close time. + + o - update the bfd doc; write a how-to-write-a-backend doc, take out + the stupid quips and fill in all the blanks. + + o - upgrade the reloc handling as per Steve's suggestion. + + + + diff --git a/bfd/configure.in b/bfd/configure.in index bdd5ee86bd..a9e808b96e 100644 --- a/bfd/configure.in +++ b/bfd/configure.in @@ -31,6 +31,11 @@ fi # per-target: +if [ "x$target" = "xall" ]; then + echo "*** 'all' can not be the default target" 1>&2 + exit 1 +fi + # WHEN ADDING ENTRIES TO THIS MATRIX: # Make sure that the left side always has two dashes. Otherwise you # can get spurious matches. Even for unambiguous cases, do this as a @@ -60,6 +65,7 @@ case "${target}" in i[34]86-*-elf) bfd_target=i386-elf ;; i[34]86-*-netware*) bfd_target=i386-nlm ;; i[34]86-*-linux*) bfd_target=i386-linux ;; + i[34]86-*-lynx*) bfd_target=i386-lynx ;; i[34]86-none-*) bfd_target=i386-coff ;; i960-*-vxworks) bfd_target=i960-bout ;; i960-*-aout) bfd_target=i960-bout ;; @@ -89,7 +95,10 @@ case "${target}" in sparc-*-solaris2*) bfd_target=sparc-elf ;; sparc-*-sysv4*) bfd_target=sparc-elf ;; # start-sanitize-v9 - sparc64-*-aout*) bfd_target=sparc-aout ; target64=true ;; +# Don't set target64=true for sparc64-*-aout*. Keep it using the 32bit stuff +# so we continue to have something that works (until the 64 bit support is +# rock solid). + sparc64-*-aout*) bfd_target=sparc-aout ;; sparc64-*-elf*) bfd_target=sparc64-elf ; target64=true ;; # end-sanitize-v9 sparc*-*-*) bfd_target=sparc-aout ;; @@ -119,17 +128,32 @@ case "${target}" in *-tandem-*) bfd_target=st2000 ;; esac -if [ ! -f ${srcdir}/config/${bfd_target}.mt ] ; then - if [ -n "${bfd_target}" ] ; then - echo '***' No file ${srcdir}/config/${bfd_target}.mt 1>&2 +[ -z "$bfd_target" ] && bfd_target="$target" # For error message. + +all_targets=false +for targ in $bfd_target `echo $with_bfd_targets | sed 's/,/ /g'` +do + if [ "x$targ" = "xall" ]; then + all_targets=true + else + if [ ! -f ${srcdir}/config/${targ}.mt ] ; then + if [ -n "${targ}" ] ; then + echo '***' No file ${srcdir}/config/${targ}.mt 1>&2 + fi + echo '***' BFD does not support target ${targ} 1>&2 + echo '***' Look in bfd/configure.in for supported targets 1>&2 + exit 1 fi - echo '***' BFD does not support target ${target} 1>&2 - echo '***' Look in bfd/configure.in for supported targets 1>&2 - exit 1 -fi -target_makefile_frag=config/${bfd_target}.mt -# We don't do any links based on the target system, just very minor makefile + if [ "x$bfd_target" = "x$targ" ]; then + target_makefile_frag=${srcdir}/config/${targ}.mt + else + target_extra_frags="$target_extra_frags ${srcdir}/config/${targ}.mt" + fi + fi +done + +# We don't do any links based on the target system, just minor makefile # config. # post-target: @@ -137,16 +161,6 @@ target_makefile_frag=config/${bfd_target}.mt rm -f Makefile.tmp Makefile.2 mv Makefile Makefile.tmp -case ${with_minimal_bfd} in - yes) echo MINIMIZE=1 > Makefile.2 ;; - no | "") echo MINIMIZE=0 > Makefile.2 ;; - *) - echo "*** bad value \"${with_minimal_bfd}\" for minimal-bfd flag; ignored" 1>&2 - with_minimal_bfd=no - echo MINIMIZE=0 > Makefile.2 - ;; -esac - case ${with_64_bit_bfd} in yes) want64=true ;; no | "") want64=false ;; @@ -166,19 +180,108 @@ case ${host64}-${target64}-${want64} in ;; esac -if [ x${with_minimal_bfd} = xyes ] \ - && grep -s TARGET_BACKENDS ${srcdir}/${target_makefile_frag} ; then - echo 'BFD_BACKENDS = $(TARGET_BACKENDS)' >> Makefile.2 -else - echo 'BFD_BACKENDS = $(ALL_BACKENDS)' >> Makefile.2 -fi +# The default vector in the primary target. +DEFAULT_VECTOR=`sed -n ' +s/DEFAULT_VECTOR[ ]*=[ ]*\([^ ]*\)/\1/p +' $target_makefile_frag` + +if [ x${all_targets} = xfalse ]; then + + allfrags="$target_makefile_frag $target_extra_frags" -if [ x${with_minimal_bfd} = xyes ] \ - && grep -s TARGET_CPUS ${srcdir}/${target_makefile_frag} ; then - echo 'BFD_MACHINES = $(TARGET_CPUS)' >> Makefile.2 -else + # The default and selected vectors in all the configured targets. + SELECT_VECS=`sed -n ' + s/DEFAULT_VECTOR[ ]*=[ ]*\([^ ]*\)/\1/p + s/SELECT_VECS[ ]*=[ ]*\([^ ]*\)/\1/p + ' $allfrags | sort -u` + + # The architectures in all the configured targets. + SELECT_ARCHITECTURES=`sed -n ' + s/SELECT_ARCHITECTURES[ ]*=[ ]*//p + ' $allfrags | sort -u` + + # Target backend .o files. + tb= + + for vec in $SELECT_VECS + do + case "$vec" in + a29kcoff_big_vec) tb="$tb coff-a29k.o" ;; + a_out_adobe_vec) tb="$tb aout-adobe.o" ;; + aout_mips_little_vec) tb="$tb mipsbsd.o" ;; + b_out_vec_big_host) tb="$tb bout.o" ;; + b_out_vec_little_host) tb="$tb bout.o" ;; + bfd_elf32_hppa_vec) tb="$tb elf32-hppa.o elf32.o elf.o" ;; + bfd_elf32_i386_vec) tb="$tb elf32-i386.o elf32.o elf.o" ;; + bfd_elf32_i860_vec) tb="$tb elf32-i860.o elf32.o elf.o" ;; + bfd_elf32_m68k_vec) tb="$tb elf32-m68k.o elf32.o elf.o" ;; + bfd_elf32_sparc_vec) tb="$tb elf32-sparc.o elf32.o elf.o" ;; +# start-sanitize-v9 + bfd_elf64_sparc_vec) tb="$tb elf64-sparc.o elf64.o elf.o" ;; +# end-sanitize-v9 + bfd_nlm32_i386_vec) tb="$tb nlm32-i386.o" ;; + ecoff_big_vec) tb="$tb coff-mips.o" ;; + ecoff_little_vec) tb="$tb coff-mips.o" ;; + ecoffalpha_little_vec) tb="$tb coff-alpha.o" ;; + h8300coff_vec) tb="$tb coff-h8300.o" ;; + h8500coff_vec) tb="$tb coff-h8500.o" ;; + host_aout_vec) tb="$tb host-aout.o" ;; + hp300bsd_vec) tb="$tb hp300bsd.o" ;; + hp300hpux_vec) tb="$tb hp300hpux.o" ;; + hppa_vec) tb="$tb hppa.o" ;; + i386aout_vec) tb="$tb i386aout.o" ;; + i386bsd_vec) tb="$tb i386bsd.o" ;; + i386coff_vec) tb="$tb coff-i386.o" ;; + i386linux_vec) tb="$tb i386linux.o" ;; + i386lynx_vec) tb="$tb i386lynx.o" ;; + icoff_big_vec) tb="$tb coff-i960.o" ;; + icoff_little_vec) tb="$tb coff-i960.o" ;; + ieee_vec) tb="$tb ieee.o" ;; + m68kcoff_vec) tb="$tb coff-m68k.o" ;; + m68kcoffun_vec) tb="$tb coff-u68k.o" ;; + m88kbcs_vec) tb="$tb coff-m88k.o" ;; + newsos3_vec) tb="$tb newsos3.o" ;; + rs6000coff_vec) tb="$tb coff-rs6000.o" ;; + shcoff_vec) tb="$tb coff-sh.o" ;; + srec_vec) tb="$tb srec.o" ;; + sunos_big_vec) tb="$tb sunos.o aout32.o stab-syms.o" ;; + symbolsrec_vec) tb="$tb srec.o" ;; + we32kcoff_vec) tb="$tb coff-we32k.o" ;; + z8kcoff_vec) tb="$tb coff-z8k.o" ;; + + "") ;; + *) echo "*** unknown target vector $vec in $f" 1>&2; exit 1 ;; + esac + done + + # Target architecture .o files. + ta=`echo $SELECT_ARCHITECTURES | sed -e s/bfd_/cpu-/g -e s/_arch/.o/g` + + # Weed out duplicate .o files. + tb=`echo $tb | tr -s ' ' '\012' | sort -u | tr '\012' ' '` + ta=`echo $ta | tr -s ' ' '\012' | sort -u | tr '\012' ' '` + + echo "BFD_BACKENDS = $tb" >> Makefile.2 + echo "BFD_MACHINES = $ta" >> Makefile.2 + + # Only set these if they will be nonempty, for the clever echo. + test -n "$SELECT_VECS" && + selvecs=`echo $SELECT_VECS | sed -e 's/^/\&/' -e 's/ \(.\)/,\&\1/g'` + test -n "SELECT_ARCHITECTURES" && + selarchs=`echo $SELECT_ARCHITECTURES | sed -e 's/ \(.\)/,\1/g'` + +else # all_targets is true + echo 'BFD_BACKENDS = $(ALL_BACKENDS)' >> Makefile.2 echo 'BFD_MACHINES = $(ALL_MACHINES)' >> Makefile.2 -fi +fi # all_targets is true + +test -n "$DEFAULT_VECTOR" && defvec="$DEFAULT_VECTOR" + +echo "TDEFAULTS = \ +${defvec+-DDEFAULT_VECTOR=$defvec} \ +${selvecs+-DSELECT_VECS='$selvecs'} \ +${selarchs+-DSELECT_ARCHITECTURES='$selarchs'}" \ + >> Makefile.2 cat Makefile.tmp >> Makefile.2 rm -f Makefile.tmp diff --git a/bfd/targets.c b/bfd/targets.c index a0f878c650..e4e3fb4296 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -318,31 +318,6 @@ in this structure. */ -/* The default is to define a target_vector containing all the targets. - By setting MINIMIZE=1 on the "make" command line, the user can change this - to a vector containing just DEFAULT_VECTOR and any required - traditional-core-file handler. (This is to save space in the executables.) - The config files can also override the default large vector by giving an - explicit SELECT_VECS macro. */ - -#if MINIMIZE && defined(DEFAULT_VECTOR) && !defined(SELECT_VECS) -#ifdef TRAD_CORE -#define SELECT_VECS &DEFAULT_VECTOR,&trad_core_vec -#endif -#ifdef SCO_CORE -#define SELECT_VECS &DEFAULT_VECTOR,&sco_core_vec -#endif -#ifdef AIX386_CORE -#define SELECT_VECS &DEFAULT_VECTOR,&aix386_core_vec -#endif -#ifdef HPUX_CORE -#define SELECT_VECS &DEFAULT_VECTOR,&hpux_core_vec -#endif -#ifndef SELECT_VECS -#define SELECT_VECS &DEFAULT_VECTOR -#endif -#endif - /* All known xvecs. They are listed a second time below, since we can't intermix extern's and initializers. */ extern bfd_target i386lynx_vec; @@ -397,14 +372,7 @@ extern bfd_target we32kcoff_vec; extern bfd_target shcoff_vec; extern bfd_target hp300hpux_vec; extern bfd_target hp300bsd_vec; - -#if defined (HOST_HPPAHPUX) || defined (HOST_HPPABSD) extern bfd_target hppa_vec; -#endif - -#ifdef DEFAULT_VECTOR -extern bfd_target DEFAULT_VECTOR; -#endif bfd_target *target_vector[] = { @@ -414,10 +382,6 @@ bfd_target *target_vector[] = { #else /* not SELECT_VECS */ -#ifdef DEFAULT_VECTOR - &DEFAULT_VECTOR, -#endif - &i386coff_vec, &i386aout_vec, &i386lynx_vec, @@ -431,7 +395,7 @@ bfd_target *target_vector[] = { anymore. If you want to test the stuff yourself, go ahead... steve@cygnus.com Worse, since there is no magic number for archives, there - can annoying target mis-matches. */ + can be annoying target mis-matches. */ &oasys_vec, #endif &sunos_big_vec, @@ -443,7 +407,9 @@ bfd_target *target_vector[] = { &m88kbcs_vec, &srec_vec, &symbolsrec_vec, -/* &tekhex_vec,*/ +#if 0 + &tekhex_vec, +#endif &icoff_little_vec, &icoff_big_vec, &bfd_elf32_sparc_vec, @@ -478,6 +444,10 @@ bfd_target *target_vector[] = { &hp300bsd_vec, &we32kcoff_vec, +#endif /* not SELECT_VECS */ + +/* Add any required traditional-core-file-handler. */ + #ifdef TRAD_CORE &trad_core_vec, #endif @@ -491,8 +461,7 @@ bfd_target *target_vector[] = { &hpux_core_vec, #endif -#endif /* not SELECT_VECS */ - NULL, /* end of list marker */ + NULL /* end of list marker */ }; /* default_vector[0] contains either the address of the default vector, @@ -502,7 +471,7 @@ bfd_target *default_vector[] = { #ifdef DEFAULT_VECTOR &DEFAULT_VECTOR, #endif - 0, + NULL }; -- 2.34.1