--- orig/acconfig.h +++ mod/acconfig.h @@ -166,7 +166,8 @@ #include #define ISNORMAL(a) (fpclass(a)>=FP_NZERO) #else -#error "No isnormal found" +#include +#define ISNORMAL(a) (finite(a) && (a) != 0.0) #endif #endif #endif --- orig/configure.in +++ mod/configure.in @@ -238,6 +238,11 @@ then use=mingw else use=gnuwin95 fi;; + + *openbsd*) + # 'ld -Z' means disable W^X + LDFLAGS="$LDFLAGS -Z" + use=FreeBSD;; esac @@ -693,13 +698,15 @@ if test "$enable_dlopen" = "yes" ; then - AC_CHECK_LIB(dl,dlopen,have_dl=1,have_dl=0) - if test "$have_dl" = "0" ; then - echo "Cannot find dlopen in -dl" - exit 1 - fi +dnl AC_CHECK_LIB(dl,dlopen,have_dl=1,have_dl=0) +dnl if test "$have_dl" = "0" ; then +dnl echo "Cannot find dlopen in -dl" +dnl exit 1 +dnl fi + AC_SEARCH_LIBS(dlopen, dl, have_dl=1, AC_ERROR(dlopen not found)) +dnl LIBS and TLIBS - why not merged from the beginning? - TLIBS="$TLIBS -ldl -rdynamic" + TLIBS="$TLIBS -rdynamic" AC_DEFINE(USE_DLOPEN) fi @@ -1096,6 +1103,9 @@ AC_CHECK_HEADERS(sys/ioctl.h) +# OpenBSD has elf_abi.h instead of elf.h +AC_CHECK_HEADERS(elf.h elf_abi.h) + #-------------------------------------------------------------------- # The code below deals with several issues related to gettimeofday: @@ -1723,7 +1733,7 @@ AC_MSG_RESULT([no]) fi -LIBS="$LIBS $TLIBS" +LIBS="$LDFLAGS $LIBS $TLIBS" AC_SUBST(LIBS) FINAL_CFLAGS="$CFLAGS $TCFLAGS $PROCESSOR_FLAGS" AC_SUBST(FINAL_CFLAGS) --- orig/h/FreeBSD.h +++ mod/h/FreeBSD.h @@ -22,6 +22,9 @@ #endif #define ELFW(a) Mjoin(ELF,Mjoin(__ELF_NATIVE_CLASS,Mjoin(_,a))) +/* OpenBSD needs sys/types.h included before link.h, which is included + in linux.h */ +#include #include "linux.h" #if defined(__i386__) --- orig/h/bsd.h +++ mod/h/bsd.h @@ -4,7 +4,10 @@ #define UNIX #define AV #define SFASL + +#if 0 #define HAVE_AOUT +#endif #define MEM_SAVE_LOCALS \ --- orig/h/linux.h +++ mod/h/linux.h @@ -5,7 +5,7 @@ #endif #undef HAVE_AOUT -#define HAVE_AOUT +/* #define HAVE_AOUT */ #define HAVE_ELF /* Seeking to the end of ELF data is a little messy... */ --- orig/o/alloc.c +++ mod/o/alloc.c @@ -147,7 +147,7 @@ return(e); - IF_ALLOCATE_ERR fputs("Can't allocate. Good-bye!",stderr); + IF_ALLOCATE_ERR error("Can't allocate. Good-bye!"); #ifdef SGC if (sgc_enabled) make_writable(page(core_end),page(core_end)+n-m); @@ -1396,7 +1396,10 @@ /* #endif */ #ifdef BABY_MALLOC_SIZE - if (GBC_enable == 0) return baby_malloc(size); + if (GBC_enable == 0) { + in_malloc = 0; + return baby_malloc(size); + } #else if (GBC_enable==0) { if ( initflag ==0) @@ -1469,7 +1472,7 @@ int i, j; /* was allocated by baby_malloc */ #ifdef BABY_MALLOC_SIZE - if (ptr >= baby_malloc_data && ptr -baby_malloc_data = (void*)baby_malloc_data && ptr - (void*)baby_malloc_data size) --- orig/o/fasldlsym.c +++ mod/o/fasldlsym.c @@ -28,8 +28,10 @@ #ifdef HAVE_AOUT #include HAVE_AOUT #endif -#ifdef HAVE_ELF +#if defined(HAVE_ELF_H) #include +#elif defined(HAVE_ELF_ABI_H) +#include #endif #include "ptable.h" --- orig/o/file.d +++ mod/o/file.d @@ -78,8 +78,10 @@ #define a_drsize rdsize #endif -#ifdef HAVE_ELF +#if defined(HAVE_ELF_H) #include +#elif defined(HAVE_ELF_ABI_H) +#include #endif extern void tcpCloseSocket (int fd); --- orig/o/main.c +++ mod/o/main.c @@ -239,6 +239,18 @@ rl.rlim_cur > MAX_STACK_SIZE) rl.rlim_cur=MAX_STACK_SIZE; cssize = rl.rlim_cur/4 - 4*CSGETA; + + /* Maybe the soft limit for data segment size is lower than the + * hard limit. In that case, we want as much as possible. + */ + getrlimit(RLIMIT_DATA, &rl); + if (rl.rlim_cur != RLIM_INFINITY && + (rl.rlim_max == RLIM_INFINITY || + rl.rlim_max > rl.rlim_cur)) { + rl.rlim_cur = rl.rlim_max; + setrlimit(RLIMIT_DATA, &rl); + } + #endif #endif /* BSD */ --- orig/o/unexelf.c +++ mod/o/unexelf.c @@ -397,6 +397,9 @@ */ +/* We do not use mmap because that fails with NFS. + Instead we read the whole file, modify it, and write it out. */ + #ifndef emacs #define fatal(a, b...) fprintf (stderr, a, ##b), exit (1) #else @@ -425,6 +428,18 @@ #include /* for HDRR declaration */ #endif /* __sgi */ +#ifndef MAP_ANON +#ifdef MAP_ANONYMOUS +#define MAP_ANON MAP_ANONYMOUS +#else +#define MAP_ANON 0 +#endif +#endif + +#ifndef MAP_FAILED +#define MAP_FAILED ((void *) -1) +#endif + #if defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__) /* Declare COFF debugging symbol table. This used to be in /usr/include/sym.h, but this file is no longer included in Red Hat @@ -624,9 +639,14 @@ /* Pointers to the base of the image of the two files. */ caddr_t old_base, new_base; - /* Pointers to the file, program and section headers for the old and new - * files. - */ +#if MAP_ANON == 0 + int mmap_fd; +#else +# define mmap_fd -1 +#endif + + /* Pointers to the file, program and section headers for the old and + new files. */ ElfW(Ehdr) *old_file_h, *new_file_h; ElfW(Phdr) *old_program_h, *new_program_h; ElfW(Shdr) *old_section_h, *new_section_h; @@ -644,8 +664,10 @@ int old_data_index, new_data2_index; int old_mdebug_index; struct stat stat_buf; + int old_file_size; - /* Open the old file & map it into the address space. */ + /* Open the old file, allocate a buffer of the right size, and read + in the file contents. */ old_file = open (old_name, O_RDONLY); @@ -655,16 +677,24 @@ if (fstat (old_file, &stat_buf) == -1) fatal ("Can't fstat (%s): errno %d\n", old_name, errno); - old_base = mmap ((caddr_t) 0, stat_buf.st_size, PROT_READ, MAP_SHARED, - old_file, 0); +#if MAP_ANON == 0 + mmap_fd = open ("/dev/zero", O_RDONLY); + if (mmap_fd < 0) + fatal ("Can't open /dev/zero for reading: errno %d\n", errno); +#endif + + /* We cannot use malloc here because that may use sbrk. If it does, + we'd dump our temporary buffers with Emacs, and we'd have to be + extra careful to use the correct value of sbrk(0) after + allocating all buffers in the code below, which we aren't. */ + old_file_size = stat_buf.st_size; + old_base = mmap (NULL, old_file_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE, mmap_fd, 0); + if (old_base == MAP_FAILED) + fatal ("Can't allocate buffer for %s\n", old_name); - if (old_base == (caddr_t) -1) - fatal ("Can't mmap (%s): errno %d\n", old_name, errno); - -#ifdef DEBUG - fprintf (stderr, "mmap (%s, %x) -> %x\n", old_name, stat_buf.st_size, - old_base); -#endif + if (read (old_file, old_base, stat_buf.st_size) != stat_buf.st_size) + fatal ("Didn't read all of %s: errno %d\n", old_name, errno); /* Get pointers to headers & section names */ @@ -735,10 +765,9 @@ if ((unsigned) new_bss_addr < (unsigned) old_bss_addr + old_bss_size) fatal (".bss shrank when undumping???\n"); - /* Set the output file to the right size and mmap it. Set - * pointers to various interesting objects. stat_buf still has - * old_file data. - */ + /* Set the output file to the right size. Allocate a buffer to hold + the image of the new file. Set pointers to various interesting + objects. stat_buf still has old_file data. */ new_file = open (new_name, O_RDWR | O_CREAT, 0666); if (new_file < 0) @@ -749,16 +778,10 @@ if (ftruncate (new_file, new_file_size)) fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno); -#ifdef UNEXEC_USE_MAP_PRIVATE - new_base = mmap ((caddr_t) 0, new_file_size, PROT_READ | PROT_WRITE, - MAP_PRIVATE, new_file, 0); -#else - new_base = mmap ((caddr_t) 0, new_file_size, PROT_READ | PROT_WRITE, - MAP_SHARED, new_file, 0); -#endif - - if (new_base == (caddr_t) -1) - fatal ("Can't mmap (%s): errno %d\n", new_name, errno); + new_base = mmap (NULL, new_file_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE, mmap_fd, 0); + if (new_base == MAP_FAILED) + fatal ("Can't allocate buffer for %s\n", old_name); new_file_h = (ElfW(Ehdr) *) new_base; new_program_h = (ElfW(Phdr) *) ((byte *) new_base + old_file_h->e_phoff); @@ -913,8 +936,13 @@ } else { - /* Any section that was original placed AFTER the bss - section should now be off by NEW_DATA2_SIZE. */ + /* Any section that was originally placed after the .bss + section should now be off by NEW_DATA2_SIZE. If a + section overlaps the .bss section, consider it to be + placed after the .bss section. Overlap can occur if the + section just before .bss has less-strict alignment; this + was observed between .symtab and .bss on Solaris 2.5.1 + (sparc) with GCC snapshot 960602. */ #ifdef SOLARIS_POWERPC /* On PPC Reference Platform running Solaris 2.5.1 the plt section is also of type NOBI like the bss section. @@ -928,9 +956,8 @@ >= OLD_SECTION_H (old_bss_index-1).sh_offset) NEW_SECTION_H (nn).sh_offset += new_data2_size; #else - if (round_up (NEW_SECTION_H (nn).sh_offset, - OLD_SECTION_H (old_bss_index).sh_addralign) - >= new_data2_offset) + if (NEW_SECTION_H (nn).sh_offset + NEW_SECTION_H (nn).sh_size + > new_data2_offset) NEW_SECTION_H (nn).sh_offset += new_data2_size; #endif /* Any section that was originally placed after the section @@ -1179,16 +1206,21 @@ } } -#ifdef UNEXEC_USE_MAP_PRIVATE - if (lseek (new_file, 0, SEEK_SET) == -1) - fatal ("Can't rewind (%s): errno %d\n", new_name, errno); + /* Write out new_file, and free the buffers. */ if (write (new_file, new_base, new_file_size) != new_file_size) - fatal ("Can't write (%s): errno %d\n", new_name, errno); -#endif + fatal ("Didn't write %d bytes to %s: errno %d\n", + new_file_size, new_base, errno); + + munmap (old_base, old_file_size); + munmap (new_base, new_file_size); /* Close the files and make the new file executable. */ +#if MAP_ANON == 0 + close (mmap_fd); +#endif + if (close (old_file)) fatal ("Can't close (%s): errno %d\n", old_name, errno); @@ -1209,6 +1241,9 @@ gcl") we make the NEW_SECTION_H executable since it will have code in it. NEW_SECTION_H (nn).sh_flags |= SHF_EXECINSTR; + Partly synchronized with Emacs HEAD of 2004-04-12 by Magnus Henoch. + The files themselves are no longer mmap'ed, but memory is allocated + with mmap, and everything is written to the new file at the end. */ #ifdef UNIXSAVE #include "save.c" --- orig/o/unixfasl.c +++ mod/o/unixfasl.c @@ -282,7 +282,7 @@ static int faslink(object faslfile, object ldargstring) { -#if ((defined(__linux__) || defined(__FreeBSD__)) && defined(__ELF__)) || defined(DARWIN) +#if ((defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__ELF__)) || defined(DARWIN) FEerror("faslink() not supported for ELF yet",0); return 0; #else --- orig/unixport/rsym_elf.c +++ mod/unixport/rsym_elf.c @@ -27,7 +27,28 @@ #include "ext_sym.h" +#if defined(HAVE_ELF_H) #include +#elif defined(HAVE_ELF_ABI_H) +#include +#else +#error Neither elf.h nor elf_abi.h found +#endif + +/* For OpenBSD */ +#ifndef ElfW +/* ElfW(type) becomes Elf32_type or Elf64_type, respectively. + * Defined in link.h on Linux. OpenBSD does this in another way: + * by defining Elf_Ehdr etc to the correct type in exec_elf.h. + */ +#ifdef Elf_Ehdr +#define ElfW(type) Elf_##type +#else +#error Neither ElfW nor Elf_Ehdr defined +#endif + +#endif + ElfW(Phdr) pheader; ElfW(Ehdr) eheader; ElfW(Sym) *symbol_table; @@ -36,7 +57,13 @@ #undef EXT_and_TEXT_BSS_DAT /* #define mjoin(a,b) a ## b */ /* #define Mjoin(a,b) mjoin(a,b) */ +#if defined(__ELF_NATIVE_CLASS) #define ELFW(a) Mjoin(ELF,Mjoin(__ELF_NATIVE_CLASS,Mjoin(_,a))) +#elif defined(ELFSIZE) +#define ELFW(a) Mjoin(ELF,Mjoin(ELFSIZE,Mjoin(_,a))) +#else +#error Neither __ELF_NATIVE_CLASS nor ELFSIZE defined +#endif int nsyms; char *my_string_table;