diff --git a/src/cmd/chown/Makefile b/src/cmd/chown/Makefile index 3a1c17b..f46a845 100644 --- a/src/cmd/chown/Makefile +++ b/src/cmd/chown/Makefile @@ -1,7 +1,7 @@ TOPSRC = $(shell cd ../../..; pwd) include $(TOPSRC)/target.mk -CFLAGS = -O +CFLAGS = -O -Werror SRCS = chown.c OBJS = chown.o MAN = chown.0 diff --git a/src/cmd/chown/chown.c b/src/cmd/chown/chown.c index ac3c188..b0dffb9 100644 --- a/src/cmd/chown/chown.c +++ b/src/cmd/chown/chown.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include static char *fchdirmsg = "Can't fchdir() back to starting directory"; struct passwd *pwd; @@ -27,88 +29,52 @@ int status; int fflag; int rflag; -main(argc, argv) - char *argv[]; -{ - register int c; - register gid_t gid; - register char *cp, *group; - struct group *grp; - int fcurdir; - - argc--, argv++; - while (argc > 0 && argv[0][0] == '-') { - for (cp = &argv[0][1]; *cp; cp++) switch (*cp) { - - case 'f': - fflag++; - break; - - case 'R': - rflag++; - break; - - default: - fatal(255, "unknown option: %c", *cp); - } - argv++, argc--; - } - if (argc < 2) { - fprintf(stderr, "usage: chown [-fR] owner[.group] file ...\n"); - exit(-1); - } - gid = -1; - group = index(argv[0], '.'); - if (group != NULL) { - *group++ = '\0'; - if (!isnumber(group)) { - if ((grp = getgrnam(group)) == NULL) - fatal(255, "unknown group: %s",group); - gid = grp -> gr_gid; - (void) endgrent(); - } else if (*group != '\0') - gid = atoi(group); - } - if (!isnumber(argv[0])) { - if ((pwd = getpwnam(argv[0])) == NULL) - fatal(255, "unknown user id: %s",argv[0]); - uid = pwd->pw_uid; - } else - uid = atoi(argv[0]); - - fcurdir = open(".", O_RDONLY); - if (fcurdir < 0) - fatal(255, "Can't open ."); - - for (c = 1; c < argc; c++) { - /* do stat for directory arguments */ - if (lstat(argv[c], &stbuf) < 0) { - status += Perror(argv[c]); - continue; - } - if (rflag && ((stbuf.st_mode&S_IFMT) == S_IFDIR)) { - status += chownr(argv[c], uid, gid, fcurdir); - continue; - } - if (chown(argv[c], uid, gid)) { - status += Perror(argv[c]); - continue; - } - } - exit(status); -} - +int isnumber(s) char *s; { - register c; + int c; - while(c = *s++) + while ((c = *s++)) if (!isdigit(c)) return (0); return (1); } +int +Perror(s) + char *s; +{ + if (!fflag) { + fprintf(stderr, "chown: "); + perror(s); + } + return (!fflag); +} + +int +error(fmt, a) + char *fmt, *a; +{ + if (!fflag) { + fprintf(stderr, "chown: "); + fprintf(stderr, fmt, a); + putc('\n', stderr); + } + return (!fflag); +} + +void +fatal(status, fmt, a) + int status; + char *fmt, *a; +{ + fflag = 0; + (void) error(fmt, a); + exit(status); +} + +int chownr(dir, uid, gid, savedir) char *dir; { @@ -150,41 +116,80 @@ chownr(dir, uid, gid, savedir) (ecode = Perror(dp->d_name))) break; } - if (fchdir(savedir) < 0) - fatal(255, fchdirmsg); + if (fchdir(savedir) < 0) + fatal(255, fchdirmsg, ""); closedir(dirp); return (ecode); } -error(fmt, a) - char *fmt, *a; +int +main(argc, argv) + char *argv[]; { + register int c; + register gid_t gid; + register char *cp, *group; + struct group *grp; + int fcurdir; - if (!fflag) { - fprintf(stderr, "chown: "); - fprintf(stderr, fmt, a); - putc('\n', stderr); + argc--, argv++; + while (argc > 0 && argv[0][0] == '-') { + for (cp = &argv[0][1]; *cp; cp++) switch (*cp) { + + case 'f': + fflag++; + break; + + case 'R': + rflag++; + break; + + default: + fatal(255, "unknown option: %c", (char*)(int)*cp); + } + argv++, argc--; } - return (!fflag); -} + if (argc < 2) { + fprintf(stderr, "usage: chown [-fR] owner[.group] file ...\n"); + exit(-1); + } + gid = -1; + group = index(argv[0], '.'); + if (group != NULL) { + *group++ = '\0'; + if (!isnumber(group)) { + if ((grp = getgrnam(group)) == NULL) + fatal(255, "unknown group: %s", group); + gid = grp -> gr_gid; + (void) endgrent(); + } else if (*group != '\0') + gid = atoi(group); + } + if (!isnumber(argv[0])) { + if ((pwd = getpwnam(argv[0])) == NULL) + fatal(255, "unknown user id: %s", argv[0]); + uid = pwd->pw_uid; + } else + uid = atoi(argv[0]); -fatal(status, fmt, a) - int status; - char *fmt, *a; -{ + fcurdir = open(".", O_RDONLY); + if (fcurdir < 0) + fatal(255, "Can't open .", ""); - fflag = 0; - (void) error(fmt, a); + for (c = 1; c < argc; c++) { + /* do stat for directory arguments */ + if (lstat(argv[c], &stbuf) < 0) { + status += Perror(argv[c]); + continue; + } + if (rflag && ((stbuf.st_mode&S_IFMT) == S_IFDIR)) { + status += chownr(argv[c], uid, gid, fcurdir); + continue; + } + if (chown(argv[c], uid, gid)) { + status += Perror(argv[c]); + continue; + } + } exit(status); } - -Perror(s) - char *s; -{ - - if (!fflag) { - fprintf(stderr, "chown: "); - perror(s); - } - return (!fflag); -} diff --git a/src/elf32-mips.ld b/src/elf32-mips.ld index f3443a6..dae0110 100644 --- a/src/elf32-mips.ld +++ b/src/elf32-mips.ld @@ -250,4 +250,5 @@ SECTIONS .gcc_compiled_long64 : { KEEP(*(.gcc_compiled_long64)) } /DISCARD/ : { *(.rel.dyn) } /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) } + /DISCARD/ : { *(.reginfo) *(.MIPS.abiflags) *(.got.plt) *(.got) } } diff --git a/src/libclang/Makefile b/src/libclang/Makefile index 312e24c..3756b50 100644 --- a/src/libclang/Makefile +++ b/src/libclang/Makefile @@ -12,6 +12,7 @@ OBJS = adddf3.o \ fixdfsi.o \ floatsidf.o \ floatsisf.o \ + fp_mode.o \ muldf3.o \ mulsf3.o \ subsf3.o diff --git a/src/libclang/fp_mode.c b/src/libclang/fp_mode.c new file mode 100644 index 0000000..c1b6c1f --- /dev/null +++ b/src/libclang/fp_mode.c @@ -0,0 +1,24 @@ +//===----- lib/fp_mode.c - Floaing-point environment mode utilities --C -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file provides a default implementation of fp_mode.h for architectures +// that does not support or does not have an implementation of floating point +// environment mode. +// +//===----------------------------------------------------------------------===// + +#include "fp_mode.h" + +// IEEE-754 default rounding (to nearest, ties to even). +FE_ROUND_MODE __fe_getround() { + return FE_TONEAREST; +} + +int __fe_raise_inexact() { + return 0; +} diff --git a/target.mk b/target.mk index 47164c5..63ac502 100644 --- a/target.mk +++ b/target.mk @@ -59,7 +59,7 @@ ELF2AOUT = $(TOPSRC)/tools/elf2aout/elf2aout CFLAGS = -Os -nostdinc -LDFLAGS = -T$(TOPSRC)/src/elf32-mips.ld $(TOPSRC)/src/crt0.o -L$(TOPSRC)/src +LDFLAGS = --nmagic -T$(TOPSRC)/src/elf32-mips.ld $(TOPSRC)/src/crt0.o -L$(TOPSRC)/src LIBS = -lc -lclang # Enable mips16e instruction set by default diff --git a/tools/elf2aout/elf2aout.c b/tools/elf2aout/elf2aout.c index 98fe60d..3ce2103 100644 --- a/tools/elf2aout/elf2aout.c +++ b/tools/elf2aout/elf2aout.c @@ -447,9 +447,14 @@ usage: fprintf(stderr, ph[i].p_type == PT_GNU_EH_FRAME) continue; + /* Ignore zero sized segments. */ + if (ph[i].p_memsz == 0) + continue; + if (verbose) printf ("Section type=%x flags=%x vaddr=%x filesz=%x\n", ph[i].p_type, ph[i].p_flags, ph[i].p_vaddr, ph[i].p_filesz); + /* Section types we can't handle... */ if (ph[i].p_type != PT_LOAD && ph[i].p_type != PT_GNU_EH_FRAME) errx(1, "Program header %d type %x can't be converted.", i, ph[i].p_type);