[gcc] gcc as a cross-compiler

Warren Jasper wjj at SUN-VALLEY.STANFORD.EDU
Mon May 28 05:04:30 AEST 1990


Archive-name: gnu-cross-compiler/25-May-90
Original-posting-by: wjj at SUN-VALLEY.STANFORD.EDU (Warren Jasper)
Original-subject: gcc as a cross-compiler
Reposted-by: emv at math.lsa.umich.edu (Edward Vielmetti)

[Reposted from gnu.gcc.
Comments on this service to emv at math.lsa.umich.edu (Edward Vielmetti).]


I have received a few requests for making gcc into a cross compiler
from the Sun4 (Host) to a Motorola 680X0 (Target) single-board
computer.  We use gcc to generate code that we compile on a
SPARCStation to run on our real time MVME 147 boards (68030 SBC).
Here is a step by step procedure for doing this.

Note: I am trying to finish up my PhD dissertation, and I don't have a
lot of time to help people with this.  If you can not get this to
work, please do NOT ask me for help.  Sorry, but I have to finish up.

1) You will need to get the latest copies of gcc (1.37.1), gas(1.35) and gld.
2) Make sure you have a working gcc compiler. Ours is in /local/bin.
3) Copy the scripts Makefile.cross and cross-config.gcc into
   the main gcc directory. e.g. /usr/local/src/gcc/gcc.1.37.1.
4) type "cross-config.gcc sun4-os4 sun3-os4". This will set up the
   correct symbolic links for you.
5) Edit Makefile.cross if you need to change directory paths.
6) Type make -f Makefile.cross  
   Note: If you get an error making gnulib{2}, don't worry about it.
   There is no good way that I know of on how to make a cross compiled
   version of this.  Best to copy a version made on a Sun3 into 
   DESTDIR.  Unless you use long long, you don't need gnulib2 anyway.
   This should make the cross-compiler.

Now for the cross assembler and loader.

7) Copy Makefile.gas into the gas directory and type
   make -f Makefile.gas
8) Copy Makefile.gld into the gld directory. Type
   make -f Makefile.gld
   Warning: There were some problems with earlier versions of gld.  I think
   that they were fixed. If not, get the latest ld from the g++ distribution.
   I think our bug fixes were incorporated, but I'm not sure.  If gld does not
   cross load, send me mail and I'll see what I can do.

9) Copy your version of gcc into /usr/local/lib/sun4.  In this directory
   should be:

   gcc-as        gcc-sun3-as
   gcc           gcc-sun3-gcc
   gcc-cc1       gcc-sun3-cc1
   gcc-cpp       gcc-sun3-cpp
   gcc-gnublib   gcc-sun3-gnulib <-- you have to make this on a Sun3
                 gcc-sun3-ld


copy gcc and gld (scripts at the end of this file) into /usr/local/bin.

10) gld does not do dynamic loading.  You don't want this anyway for
    your target  processor.  Also, ld does not know how to get to the 
    C libraries such as libC.a.  Don't worry about this either, since
    you will be using the ld -r option anyway.

    Also, don't forget to include the file math-68881.h if your
    SBC has the math chip.  This file goes into ./gcc-include.

11) To compile normally, just type

   		gcc foo.c
    To cross compile:
		gcc -sun3 -c cross_foo.c 
                gld -sun3 -r -o cross_foo cross_foo.o
   
Good Luck !!

		
Warren Jasper
Stanford University

______________________________________________________________________
Makefile.cross:

# Makefile for GNU C cross-compiler.
# Written by Warren J. Jasper  Stanford Univerity 1989

#Make sure you have a working gcc on your host machine in directory BINDIR
#Run cross-config.gcc to set up the backend files.

BINDIR = /local/bin
HOST_ARCH = sun4
TARGET_ARCH = sun3
PROGRAMS = gcc cpp cc1
EXECUTABLES = $(PROGRAMS:%=gcc-$(TARGET_ARCH)-%)

DESTDIR = /usr/local/lib/$(HOST_ARCH)
INSTALL_OPTIONS = -m 751 -g bin -s

$(PROGRAMS):
	$(MAKE) CC=$(BINDIR)/gcc CFLAGS="-g -O"

install : $(PROGRAMS)
	install $(INSTALL_OPTIONS) gcc $(DESTDIR)/gcc-$(TARGET_ARCH)-gcc
	install $(INSTALL_OPTIONS) cpp $(DESTDIR)/gcc-$(TARGET_ARCH)-cpp
	install $(INSTALL_OPTIONS) cc1 $(DESTDIR)/gcc-$(TARGET_ARCH)-cc1

clean:
	$(MAKE) clean

________________________________________________________________________
cross-config.gcc:

#!/bin/sh
# Cross-Configuration script for GNU CC version 1.37.1
#  Modified by Warren J. Jasper  Stanford Univerity  1990


#GNU CC is free software; you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation; either version 1, or (at your option)
#any later version.

#GNU CC is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.

#You should have received a copy of the GNU General Public License
#along with GNU CC; see the file COPYING.  If not, write to
#the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

#
# Shell script to create proper links to machine-dependent files in
# preparation for cross-compiling gcc.
#
# Usage: cross-config.gcc [vint] Host_Machine Target_Machine
#
# If cross-config.gcc succeeds, it leaves its status in config.status.
# If cross-config.gcc fails after disturbing the status quo,
# config.status is removed.
#

progname=$0

remove=/bin/rm
hard_link=ln
symbolic_link='ln -s'

#for Test
#remove="echo rm"
#hard_link="echo ln"
#symbolic_link="echo ln -s"

case $# in
3)
	vint=on
	shift
	;;
*)
	;;
esac

case $# in
2)
	Host_Machine=$1
	shift
	Target_Machine=$1

	case $Host_Machine in
	sun4 | sun-4 | sun4-os3 | sun-4-os3)
		host_cpu_type=sparc
		configuration_file=xm-sparc.h
		;;
	sun3 | sun-3 | sun3-os3 | sun-3-os3)
		host_cpu_type=m68k
		configuration_file=xm-m68k.h
		;;
	sun3-nfp | sun-3-nfp | sun3-nfp-os3 | sun-3-nfp-os3)
		host_cpu_type=m68k
		configuration_file=xm-m68k.h
		;;
	sun2 | sun-2 | sun2-os3 | sun-2-os3)
		host_cpu_type=m68k
		configuration_file=xm-m68k.h
		;;
	sun386 | sun386i | roadrunner)
		host_cpu_type=i386
		configuration_file=xm-sun386i.h
		;;
	sun4-os4 | sun-4-os4)
		host_cpu_type=sparc
		configuration_file=xm-sparc.h
		;;
	sun3-os4 | sun-3-os4)
		host_cpu_type=m68k
		configuration_file=xm-m68k.h
		;;
	sun3-nfp-os4 | sun-3-nfp-os4)
		host_cpu_type=m68k
		configuration_file=xm-68k.h
		;;
	sun3-fpa-os4 | sun-3-fpa-os4)
		host_cpu_type=m68k
		configuration_file=xm-68k.h
		;;
	sun2-os4 |sun-2-os4)
		host_cpu_type=m68k
		configuration_file=xm-sunos4.h
		;;
	esac

	case $Target_Machine in
	sun4 | sun-4 | sun4-os3 | sun-4-os3)
		target_cpu_type=sparc
		target_machine=tm-sun4os3.h
		;;
	sun3 | sun-3 | sun3-os3 | sun-3-os3)
		target_cpu_type=m68k
		target_machine=tm-sun3os3.h
		;;
	sun3-nfp | sun-3-nfp | sun3-nfp-os3 | sun-3-nfp-os3)
		target_cpu_type=m68k
		target_machine=tm-sun3os3nf.h
		;;
	sun2 | sun-2 | sun2-os3 | sun-2-os3)
		target_cpu_type=m68k
		target_machine=tm-sun2.h
		;;
	sun386 | sun386i | roadrunner)
		target_cpu_type=i386
		target_machine=tm-sun386i.h
		;;
	sun4-os4 | sun-4-os4)
		target_cpu_type=sparc
		target_machine=tm-sparc.h
		;;
	sun3-os4 | sun-3-os4)
		target_cpu_type=m68k
		target_machine=tm-sun3.h
		;;
	sun3-nfp-os4 | sun-3-nfp-os4)
		target_cpu_type=m68k
		target_machine=tm-sun3-nfp.h
		;;
	sun2-os4 |sun-2-os4)
		target_cpu_type=m68k
		target_machine=tm-sun2.h
		;;
	esac


		# if cpu_type is not set, define cpu_type to machine.
		#
	host_cpu_type=${host_cpu_type-$Host_Machine}
	configuration_file=${configuration_file-xm-$host_cpu_type.h}
	target_machine=${target_machine-tm-$Target_Machine.h}
	machine_description=${target_cpu_type}.md
	aux_output=${aux_output-out-$target_cpu_type.c}

	if [ xx${vint} = xx ]
	then
		files="$configuration_file $target_machine
			$machine_description $aux_output"
		links="config.h tm.h md aux-output.c"
	else
		files="$configuration_file tm-vmc.h $target_machine
			$machine_description $aux_output"
		links="config.h tm.h tm-pre.h md aux-output.c"
	fi

	while [ -n "$files" ]
	do
		# set file to car of files, files to cdr of files
		set $files; file=$1; shift; files=$*
		set $links; link=$1; shift; links=$*

		if [ ! -r config/$file ]
		then
			echo "$progname: cannot create a link \`$link',"
			echo "since the file \`config/$file' does not exist."
			exit 1
		fi

		$remove -f $link
		rm -f config.status
		# Make a symlink if possible, otherwise try a hard link
		$symbolic_link config/$file $link 2>/dev/null || $hard_link config/$file $link

		if [ ! -r $link ]
		then
			echo "$progname: unable to link \`$link' to \`config/$file'."
			exit 1
		fi
		echo "Linked \`$link' to \`config/$file'."
	done

	if [ xx${vint} = xx ]
	then
	  echo "Links are now set up for use with a $Host_Machine"\
	       "to cross compile on a $Target_Machine." \
			| tee config.status
	else
	  echo "Links are now set up for use with a $Host_Machine (vint) "\
	       "to cross compile on a $Ttarget_Machine (vint)." \
			| tee config.status
	fi
	exit 0

	;;
*)
	echo "Usage: $progname Host_Machine Target_Machine"
	echo -n "Where \`Host_Machine' is something like "
	echo "sun4-os4"
	echo -n "And \`Target_Machine' is something like "
	echo "sun3-os4"
	if [ -r config.status ]
	then
		cat config.status
	fi
	exit 1
	;;
esac

________________________________________________________________________
Makefile.gas:

#
# Makefile for building gas cross assembler
#

# Specify the host and target architectures
HOST_ARCH = sun4
TARGET_ARCH = sun3

# Set up Sun compatible cross-compilation options
CROSS_COMPILE_FLAGS = -DSUN3=3 -DTARGET=SUN3

# Generate name of execuatable
EXECUTABLE = gcc-$(TARGET_ARCH)-as

# Generate path to executable
TARGET_DIR = $(HOST_ARCH)
DESTDIR = /usr/local/lib/$(TARGET_DIR)

INSTALL_OPTIONS = -m 751 -g bin -s

CC = gcc
CFLAGS = -O -g $(CROSS_COMPILE_FLAGS)

$(EXECUTABLE) :
	ln -s m-sun3.h m68k.h
	make a68
	mv a68 $@

install : $(EXECUTABLE)
	install $(INSTALL_OPTIONS) $(EXECUTABLE) $(DESTDIR)
_______________________________________________________________________
Makefile.gld

#
# Makefile for building gld cross loader
#

# Specify the host and target architectures
HOST_ARCH = sun4
TARGET_ARCH = sun3

# Set up Sun compatible cross-compilation options
CROSS_COMPILE_FLAGS = -DSUN3=3 -DTARGET=SUN3

# Generate name of execuatable
EXECUTABLE = gcc-$(TARGET_ARCH)-ld

# Generate path to executable
TARGET_DIR = $(HOST_ARCH)
DESTDIR = /usr/local/lib/$(TARGET_DIR)

INSTALL_OPTIONS = -m 751 -g bin -s

CC = gcc
CFLAGS = -O -g $(CROSS_COMPILE_FLAGS)

$(EXECUTABLE) : gld.c
	$(CC) $(CFLAGS) -o $@ $?

install : $(EXECUTABLE)
	install $(INSTALL_OPTIONS) $(EXECUTABLE) $(DESTDIR)
______________________________________________________________________
gcc:

#! /bin/csh -f
#
#   Name:
#	gcc    front-end driver script for GNU C compiler
#
#	gcc  [ -target_arch ] [ gcc_options ]  files
#
#   Description:
#	Provides support for Sun compatible cross-compilation via the
#	-TARGET_ARCH command line option.
#
#   Files:
#	/local/lib/ARCH/gcc		Files used for native compilation
#	/local/lib/ARCH/gcc-cpp
#	/local/lib/ARCH/gcc-cc1
#	/local/lib/ARCH/gcc-as
#	/local/lib/ARCH/gcc-ld
#
#	/local/lib/sun4/gcc-sun3-gcc	Files used for cross compilation
#	/local/lib/sun4/gcc-sun3-cpp
#	/local/lib/sun4/gcc-sun3-cc1
#	/local/lib/sun4/gcc-sun3-as
#	/local/lib/sun4/gcc-sun3-ld
#
#   Written by:	Marc Ullman & Stan Schneider, Stanford	Nov  3, 1989
#
#   Revision History:
#   Ver. 1.01,	Warren Jasper, Stanford	University	Jan 10, 1989
#	Include 68881 for cross compilation.
#__________________________________________________________________________


#begin
    set target	  = ""
    set argumemts = ( )

    while ( $#argv > 0  )
	if ( "$argv[1]" =~ -sun* ) then
	    set target = $argv[1]
	else
	    set argumemts = ( $argumemts $argv[1] )
	endif
	shift
    end #while

    if ( "$target" == "-sun3"  &&  `arch` == "sun4" ) then
	exec /local/lib/$ARCH/gcc-sun3-gcc \
		-B/local/lib/$ARCH/gcc-sun3- \
		-m68020 -m68881 -D__HAVE_68881__ $argumemts
    else
	exec /local/lib/$ARCH/gcc  $argumemts
    endif
#end.

_______________________________________________________________________
gld:


#! /bin/csh -f
# NAME
#    gld - Front-end driver script for GNU link/loader.
#
# DESCRIPTION:
#    Provides support for cross-compilation via the -TARGET_ARCH
#    command line option.
#
# FILES:
#    /usr/bin/ld			Files used for native compilation
#
#    /local/lib/sun4/gcc-sun3-ld	Files used for cross compilation
#
# WRITTEN:
#    Marc Ullman, Stan Schneider			Dec. 25, 1989
#

    set target     = FALSE
    set params

    while ( $#argv > 0  )
	if ( "$argv[1]" =~ -sun* ) then
	    set target = $argv[1]
	else
	    set params = ($params $argv[1] )
	endif
	shift
    end #while

if ($target == "-sun3" && `arch` == "sun4") then
    exec /local/lib/$ARCH/gcc-sun3-ld  $params
else
    exec ld $params
endif



More information about the Alt.sources mailing list