From 91307a366625e3ec7e618f012269130d2e5bba57 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Fri, 4 May 2001 22:29:43 +0000 Subject: This patch allows powerpc to compile again. It also checks if we are compiling for an arch for which uClibc has an ld.so or not, and otherwise sets things up to use the system ld.so. -Erik --- Makefile | 8 +-- Rules.mak | 19 ++++++- extra/gcc-uClibc/Makefile | 7 ++- ldso/Makefile | 22 ++++++--- libc/sysdeps/linux/common/statfix.h | 2 + libc/sysdeps/linux/powerpc/bits/errno.h | 60 +++++++++++++++++++++++ libc/sysdeps/linux/powerpc/bits/sem.h | 87 +++++++++++++++++++++++++++++++++ 7 files changed, 193 insertions(+), 12 deletions(-) create mode 100644 libc/sysdeps/linux/powerpc/bits/errno.h create mode 100644 libc/sysdeps/linux/powerpc/bits/sem.h diff --git a/Makefile b/Makefile index 667c961d8..82aa64ab3 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,7 @@ # #-------------------------------------------------------- +TOPDIR=./ include Rules.mak DIRS = extra misc pwd_grp stdio string termios inet signal stdlib sysdeps unistd crypt @@ -42,23 +43,24 @@ $(LIBNAME): subdirs shared: $(LIBNAME) @rm -rf tmp @mkdir tmp - @$(MAKE) -C ld.so-1/d-link + @$(MAKE) -C ld.so-1 d-link @(cd tmp; CC=$(CC) /bin/sh ../extra/scripts/get-needed-libgcc-objects.sh) if [ -s ./tmp/libgcc-need.a ] ; then \ $(CC) -g $(LDFLAGS) -shared -o $(SHARED_FULLNAME) \ -Wl,-soname,$(SHARED_MAJORNAME) -Wl,--whole-archive \ ./$(LIBNAME) ./tmp/libgcc-need.a \ - ld.so-1/d-link/ld-linux-uclibc.so.0; \ + $(LDSO) ; \ else \ $(CC) -g $(LDFLAGS) -shared -o $(SHARED_FULLNAME) \ -Wl,-soname,$(SHARED_MAJORNAME) -Wl,--whole-archive \ - ./$(LIBNAME) ld.so-1/d-link/ld-linux-uclibc.so.0; \ + ./$(LIBNAME) $(LDSO) ; \ fi @rm -rf tmp ln -sf $(SHARED_FULLNAME) $(SHARED_MAJORNAME) ln -sf $(SHARED_MAJORNAME) libc.so @$(MAKE) -C crypt shared @$(MAKE) -C ld.so-1 + echo "Using $(LDSO) for the shared library loader" done: $(LIBNAME) $(DO_SHARED) @echo diff --git a/Rules.mak b/Rules.mak index 17d7eb12a..273e45d34 100644 --- a/Rules.mak +++ b/Rules.mak @@ -30,6 +30,7 @@ MINOR_VERSION=9.5 LIBNAME=libc.a SHARED_FULLNAME=uClibc-$(MAJOR_VERSION).$(MINOR_VERSION).so SHARED_MAJORNAME=libc.so.$(MAJOR_VERSION) +UCLIBC_LDSO=ld-linux-uclibc.so.$(MAJOR_VERSION) BUILDTIME = $(shell TZ=UTC date --utc "+%Y.%m.%d-%H:%M%z") @@ -60,7 +61,23 @@ ifndef $(PREFIX) PREFIX = `pwd`/_install endif -NATIVE_ARCH = $(shell uname -m | sed -e 's/i.86/i386/' -e 's/sparc.*/sparc/' -e 's/arm.*/arm/g' -e 's/m68k.*/m68k/') +NATIVE_ARCH = $(shell uname -m | sed -e 's/i.86/i386/' -e 's/sparc.*/sparc/' -e 's/arm.*/arm/g' -e 's/m68k.*/m68k/' -e 's/ppc/powerpc/g') + +LDSO_PRESENT=$(strip $(shell cd $(TOPDIR)/ld.so-1/d-link; ls -d $(TARGET_ARCH) 2>/dev/null)) + +ifeq ($(NATIVE_ARCH), $(TARGET_ARCH)) + SYSTEM_LDSO=$(shell ldd `which $(CC)` | sed -ne /ld/p | sed -e s/\ =.*//g) +else + SYSTEM_LDSO=/lib/ld-linux.so.2 +endif + +ifeq ($(LDSO_PRESENT), $(TARGET_ARCH)) + LDSO=ld.so-1/d-link/$(UCLIBC_LDSO) +else + LDSO=$(SYSTEM_LDSO) +endif + + # It turns out the currently, function-sections causes ldelf2flt to segfault. # So till further notice, this is disabled by default.... diff --git a/extra/gcc-uClibc/Makefile b/extra/gcc-uClibc/Makefile index 75c823086..d28ab8cc9 100644 --- a/extra/gcc-uClibc/Makefile +++ b/extra/gcc-uClibc/Makefile @@ -2,7 +2,12 @@ TOPDIR = ../../ include $(TOPDIR)Rules.mak # NOTE: This may need to be modified for your system -DYNAMIC_LINKER = $(INSTALL_DIR)/lib/ld-linux-uclibc.so.$(MAJOR_VERSION) +ifeq ($(LDSO_PRESENT), $(TARGET_ARCH)) + DYNAMIC_LINKER = $(INSTALL_DIR)/lib/ld-linux-uclibc.so.$(MAJOR_VERSION) +else + DYNAMIC_LINKER=$(SYSTEM_LDSO) +endif + UCLIBC_DIR = $(shell (cd ../.. ; /bin/pwd)) GCC_BIN = $(shell which $(CC)) diff --git a/ldso/Makefile b/ldso/Makefile index a93c6f552..314d22522 100644 --- a/ldso/Makefile +++ b/ldso/Makefile @@ -5,15 +5,23 @@ SUBDIRS = util d-link libdl # man all: - set -e ; for d in $(SUBDIRS) ; do $(MAKE) -C $$d ; done + @if [ -d d-link/$(TARGET_ARCH) ] ; then \ + set -e ; for d in $(SUBDIRS) ; do $(MAKE) -C $$d ; done \ + fi; install: all - install -d $(INSTALL_DIR)/lib - install -d $(INSTALL_DIR)/etc - install -m 755 ./d-link/$(DLINKER).$(LDSO_VMAJOR) $(INSTALL_DIR)/lib/ - install -m 644 ./libdl/$(LIBDL).$(LDSO_VMAJOR) $(INSTALL_DIR)/lib/ - (cd $(INSTALL_DIR)/lib/;ln -sf $(DLINKER).$(LDSO_VMAJOR) $(DLINKER)) - (cd $(INSTALL_DIR)/lib/;ln -sf $(LIBDL).$(LDSO_VMAJOR) $(LIBDL)) + @if [ -d d-link/$(TARGET_ARCH) ] ; then \ + install -d $(INSTALL_DIR)/lib + install -d $(INSTALL_DIR)/etc + install -m 755 ./d-link/$(DLINKER).$(LDSO_VMAJOR) $(INSTALL_DIR)/lib/ + install -m 644 ./libdl/$(LIBDL).$(LDSO_VMAJOR) $(INSTALL_DIR)/lib/ + (cd $(INSTALL_DIR)/lib/;ln -sf $(DLINKER).$(LDSO_VMAJOR) $(DLINKER)) + (cd $(INSTALL_DIR)/lib/;ln -sf $(LIBDL).$(LDSO_VMAJOR) $(LIBDL)) + fi; +d-link: + @if [ -d d-link/$(TARGET_ARCH) ] ; then \ + do $(MAKE) -C d-link ; done \ + fi; clean: set -e ; for d in $(SUBDIRS) ; do $(MAKE) -C $$d $@ ; done diff --git a/libc/sysdeps/linux/common/statfix.h b/libc/sysdeps/linux/common/statfix.h index 6dad72dc4..eaf623b0e 100644 --- a/libc/sysdeps/linux/common/statfix.h +++ b/libc/sysdeps/linux/common/statfix.h @@ -1,6 +1,8 @@ #ifndef STATFIX_H #define STATFIX_H +#include + /* Pull in whatever this particular arch's kernel thinks the kernel version of * struct stat should look like. It turns out that each arch has a different * opinion on the subject, and different kernel revs use different names... */ diff --git a/libc/sysdeps/linux/powerpc/bits/errno.h b/libc/sysdeps/linux/powerpc/bits/errno.h new file mode 100644 index 000000000..7da7daf79 --- /dev/null +++ b/libc/sysdeps/linux/powerpc/bits/errno.h @@ -0,0 +1,60 @@ +/* Error constants. Linux specific version. + Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifdef _ERRNO_H + +# undef EDOM +# undef EILSEQ +# undef ERANGE +# include + +/* Linux has no ENOTSUP error code. */ +# define ENOTSUP EOPNOTSUPP + +/* Linux also has no ECANCELED error code. Since it is not used here + we define it to an invalid value. */ +# define ECANCELED 125 + +# ifndef __ASSEMBLER__ +/* We now need a declaration of the `errno' variable. */ +extern int errno; + +/* Function to get address of global `errno' variable. */ +extern int *__errno_location (void); + +# if defined _LIBC +/* We wouldn't need a special macro anymore but it is history. */ +# define __set_errno(val) (*__errno_location ()) = (val) +# endif /* _LIBC */ + +# if !defined _LIBC || defined _LIBC_REENTRANT +/* When using threads, errno is a per-thread value. */ +# define errno (*__errno_location ()) +# endif +# endif /* !__ASSEMBLER__ */ +#endif /* _ERRNO_H */ + +#if !defined _ERRNO_H && defined __need_Emath +/* This is ugly but the kernel header is not clean enough. We must + define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is + defined. */ +# define EDOM 33 /* Math argument out of domain of function. */ +# define EILSEQ 84 /* Illegal byte sequence. */ +# define ERANGE 34 /* Math result not representable. */ +#endif /* !_ERRNO_H && __need_Emath */ diff --git a/libc/sysdeps/linux/powerpc/bits/sem.h b/libc/sysdeps/linux/powerpc/bits/sem.h new file mode 100644 index 000000000..18a9ff4d6 --- /dev/null +++ b/libc/sysdeps/linux/powerpc/bits/sem.h @@ -0,0 +1,87 @@ +/* Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SYS_SEM_H +# error "Never include directly; use instead." +#endif + +#include + +/* Flags for `semop'. */ +#define SEM_UNDO 0x1000 /* undo the operation on exit */ + +/* Commands for `semctl'. */ +#define GETPID 11 /* get sempid */ +#define GETVAL 12 /* get semval */ +#define GETALL 13 /* get all semval's */ +#define GETNCNT 14 /* get semncnt */ +#define GETZCNT 15 /* get semzcnt */ +#define SETVAL 16 /* set semval */ +#define SETALL 17 /* set all semval's */ + + +/* Data structure describing a set of semaphores. */ +struct semid_ds +{ + struct ipc_perm sem_perm; /* operation permission struct */ + unsigned int __unused1; + __time_t sem_otime; /* last semop() time */ + unsigned int __unused2; + __time_t sem_ctime; /* last time changed by semctl() */ + unsigned long int sem_nsems; /* number of semaphores in set */ + unsigned long __unused3; + unsigned long __unused4; +}; + +/* The user should define a union like the following to use it for arguments + for `semctl'. + + union semun + { + int val; <= value for SETVAL + struct semid_ds *buf; <= buffer for IPC_STAT & IPC_SET + unsigned short int *array; <= array for GETALL & SETALL + struct seminfo *__buf; <= buffer for IPC_INFO + }; + + Previous versions of this file used to define this union but this is + incorrect. One can test the macro _SEM_SEMUN_UNDEFINED to see whether + one must define the union or not. */ +#define _SEM_SEMUN_UNDEFINED 1 + +#ifdef __USE_MISC + +/* ipcs ctl cmds */ +# define SEM_STAT 18 +# define SEM_INFO 19 + +struct seminfo +{ + int semmap; + int semmni; + int semmns; + int semmnu; + int semmsl; + int semopm; + int semume; + int semusz; + int semvmx; + int semaem; +}; + +#endif /* __USE_MISC */ -- cgit v1.2.3