Commit 5f9a2245 authored by David MacKenzie's avatar David MacKenzie
Browse files

make target selection fully configurable

parent 379dd965
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.
......
......@@ -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 \
......
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 <host>.
(<host> might be sun4, ...)
Create a file hosts/h-<host>.
Porting to a new target
-----------------------
Pick a name for your target. Call that <target>.
You need to create <target>.c and config/mt-<target>.
config/mt-<target> is a Makefile fragment.
The following is usually enough:
DEFAULT_VECTOR=<target>_vec
SELECT_ARCHITECTURES=bfd_<cpu>_arch
See the list of cpu types in archures.c, or "ls cpu-*.c".
The file <target>.c is the hard part. It implements the
bfd_target <target>_vec, which includes pointers to
functions that do the actual <target>-specific methods.
Porting to a <target> 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 <target>.c for
you automatically for many a.out systems. Do:
make gen-aout
./gen-aout <target> > <target>.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 <target>.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 <target> 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-<target>"
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.
......@@ -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
......
......@@ -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
};
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment