Fix linker script.

Skip empty GNU_STACK section in elf2aout utility.
This commit is contained in:
Serge
2022-05-25 22:33:30 -07:00
parent ef83392732
commit 4e2c809150
7 changed files with 138 additions and 102 deletions

View File

@@ -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

View File

@@ -17,6 +17,8 @@
#include <sys/dir.h>
#include <grp.h>
#include <strings.h>
#include <unistd.h>
#include <fcntl.h>
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);
}

View File

@@ -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) }
}

View File

@@ -12,6 +12,7 @@ OBJS = adddf3.o \
fixdfsi.o \
floatsidf.o \
floatsisf.o \
fp_mode.o \
muldf3.o \
mulsf3.o \
subsf3.o

24
src/libclang/fp_mode.c Normal file
View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);