cs: on Linux record embedded boot relative to ".rackboot" section
This commit is contained in:
parent
8c3956a272
commit
c0f14373ab
|
@ -131,10 +131,10 @@ racket.boot: racket.so
|
||||||
EMBED_DEPS = $(srcdir)/embed-boot.rkt
|
EMBED_DEPS = $(srcdir)/embed-boot.rkt
|
||||||
|
|
||||||
racketcs@NOT_OSX@: raw_racketcs racket.boot $(EMBED_DEPS)
|
racketcs@NOT_OSX@: raw_racketcs racket.boot $(EMBED_DEPS)
|
||||||
$(BOOTSTRAP_RACKET) $(srcdir)/embed-boot.rkt @COMPRESS_COMP@ raw_racketcs racketcs $(SCHEME_INC) racket.boot
|
$(BOOTSTRAP_RACKET) $(srcdir)/embed-boot.rkt @ELF_COMP@ @COMPRESS_COMP@ raw_racketcs racketcs $(SCHEME_INC) racket.boot
|
||||||
|
|
||||||
gracketcs@NOT_OSX@: raw_gracketcs racket.boot $(EMBED_DEPS)
|
gracketcs@NOT_OSX@: raw_gracketcs racket.boot $(EMBED_DEPS)
|
||||||
$(BOOTSTRAP_RACKET) $(srcdir)/embed-boot.rkt @COMPRESS_COMP@ raw_gracketcs gracketcs $(SCHEME_INC) racket.boot
|
$(BOOTSTRAP_RACKET) $(srcdir)/embed-boot.rkt @ELF_COMP@ @COMPRESS_COMP@ raw_gracketcs gracketcs $(SCHEME_INC) racket.boot
|
||||||
|
|
||||||
BOOT_OBJS = boot.o $(SCHEME_INC)/kernel.o rktio/librktio.a
|
BOOT_OBJS = boot.o $(SCHEME_INC)/kernel.o rktio/librktio.a
|
||||||
|
|
||||||
|
|
5
racket/src/cs/c/configure
vendored
5
racket/src/cs/c/configure
vendored
|
@ -629,6 +629,7 @@ FRAMEWORK_INSTALL_DIR
|
||||||
SCHEME_CONFIG_ARGS
|
SCHEME_CONFIG_ARGS
|
||||||
MAKE_BUILD_SCHEME
|
MAKE_BUILD_SCHEME
|
||||||
SCHEME_SRC
|
SCHEME_SRC
|
||||||
|
ELF_COMP
|
||||||
COMPRESS_COMP
|
COMPRESS_COMP
|
||||||
CONFIGURE_RACKET_SO_COMPILE
|
CONFIGURE_RACKET_SO_COMPILE
|
||||||
NOT_OSX
|
NOT_OSX
|
||||||
|
@ -2734,6 +2735,7 @@ OSX="not_osx"
|
||||||
NOT_OSX=""
|
NOT_OSX=""
|
||||||
CONFIGURE_RACKET_SO_COMPILE=""
|
CONFIGURE_RACKET_SO_COMPILE=""
|
||||||
COMPRESS_COMP=""
|
COMPRESS_COMP=""
|
||||||
|
ELF_COMP=""
|
||||||
|
|
||||||
FRAMEWORK_INSTALL_DIR='$(libpltdir)'
|
FRAMEWORK_INSTALL_DIR='$(libpltdir)'
|
||||||
FRAMEWORK_PREFIX='@executable_path/../lib/'
|
FRAMEWORK_PREFIX='@executable_path/../lib/'
|
||||||
|
@ -3661,6 +3663,8 @@ case "$host_os" in
|
||||||
linux*)
|
linux*)
|
||||||
MACH_OS=le
|
MACH_OS=le
|
||||||
LIBS="${LIBS} -lrt"
|
LIBS="${LIBS} -lrt"
|
||||||
|
CPPFLAGS="${CPPFLAGS} -DELF_FIND_BOOT_SECTION"
|
||||||
|
ELF_COMP="--expect-elf"
|
||||||
;;
|
;;
|
||||||
osf1*)
|
osf1*)
|
||||||
;;
|
;;
|
||||||
|
@ -4453,6 +4457,7 @@ CPPFLAGS="$CPPFLAGS $PREFLAGS"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
makefiles="Makefile"
|
makefiles="Makefile"
|
||||||
|
|
|
@ -102,6 +102,7 @@ OSX="not_osx"
|
||||||
NOT_OSX=""
|
NOT_OSX=""
|
||||||
CONFIGURE_RACKET_SO_COMPILE=""
|
CONFIGURE_RACKET_SO_COMPILE=""
|
||||||
COMPRESS_COMP=""
|
COMPRESS_COMP=""
|
||||||
|
ELF_COMP=""
|
||||||
|
|
||||||
FRAMEWORK_INSTALL_DIR='$(libpltdir)'
|
FRAMEWORK_INSTALL_DIR='$(libpltdir)'
|
||||||
FRAMEWORK_PREFIX='@executable_path/../lib/'
|
FRAMEWORK_PREFIX='@executable_path/../lib/'
|
||||||
|
@ -152,6 +153,8 @@ case "$host_os" in
|
||||||
linux*)
|
linux*)
|
||||||
MACH_OS=le
|
MACH_OS=le
|
||||||
LIBS="${LIBS} -lrt"
|
LIBS="${LIBS} -lrt"
|
||||||
|
CPPFLAGS="${CPPFLAGS} -DELF_FIND_BOOT_SECTION"
|
||||||
|
ELF_COMP="--expect-elf"
|
||||||
;;
|
;;
|
||||||
osf1*)
|
osf1*)
|
||||||
;;
|
;;
|
||||||
|
@ -423,6 +426,7 @@ AC_SUBST(OSX)
|
||||||
AC_SUBST(NOT_OSX)
|
AC_SUBST(NOT_OSX)
|
||||||
AC_SUBST(CONFIGURE_RACKET_SO_COMPILE)
|
AC_SUBST(CONFIGURE_RACKET_SO_COMPILE)
|
||||||
AC_SUBST(COMPRESS_COMP)
|
AC_SUBST(COMPRESS_COMP)
|
||||||
|
AC_SUBST(ELF_COMP)
|
||||||
AC_SUBST(SCHEME_SRC)
|
AC_SUBST(SCHEME_SRC)
|
||||||
AC_SUBST(MAKE_BUILD_SCHEME)
|
AC_SUBST(MAKE_BUILD_SCHEME)
|
||||||
AC_SUBST(SCHEME_CONFIG_ARGS)
|
AC_SUBST(SCHEME_CONFIG_ARGS)
|
||||||
|
|
|
@ -5,10 +5,14 @@
|
||||||
compiler/private/elf
|
compiler/private/elf
|
||||||
"adjust-compress.rkt")
|
"adjust-compress.rkt")
|
||||||
|
|
||||||
|
(define expect-elf? #f)
|
||||||
|
|
||||||
(command-line
|
(command-line
|
||||||
#:once-each
|
#:once-each
|
||||||
[("--compress") "Leave compiled code files as compressed"
|
[("--compress") "Leave compiled code files as compressed"
|
||||||
(enable-compress!)]
|
(enable-compress!)]
|
||||||
|
[("--expect-elf") "Record offset from ELF section"
|
||||||
|
(set! expect-elf? #t)]
|
||||||
#:args (src-file dest-file boot-dir racket.boot)
|
#:args (src-file dest-file boot-dir racket.boot)
|
||||||
|
|
||||||
(define bstr1 (adjust-compress (file->bytes (build-path boot-dir "petite.boot"))))
|
(define bstr1 (adjust-compress (file->bytes (build-path boot-dir "petite.boot"))))
|
||||||
|
@ -51,7 +55,12 @@
|
||||||
[start-pos
|
[start-pos
|
||||||
;; Success as ELF
|
;; Success as ELF
|
||||||
(ensure-executable dest-file)
|
(ensure-executable dest-file)
|
||||||
start-pos]
|
(cond
|
||||||
|
[expect-elf?
|
||||||
|
;; Find ".rackboot" at run time:
|
||||||
|
0]
|
||||||
|
[else
|
||||||
|
start-pos])]
|
||||||
[else
|
[else
|
||||||
;; Not ELF; just append to the end
|
;; Not ELF; just append to the end
|
||||||
(copy-file src-file dest-file #t)
|
(copy-file src-file dest-file #t)
|
||||||
|
@ -63,6 +72,8 @@
|
||||||
(lambda (o)
|
(lambda (o)
|
||||||
(file-position o pos)
|
(file-position o pos)
|
||||||
(write-bytes data o)))
|
(write-bytes data o)))
|
||||||
|
(when expect-elf?
|
||||||
|
(error 'embed-boot "expected ELF"))
|
||||||
pos])]))
|
pos])]))
|
||||||
|
|
||||||
(define-values (i o) (open-input-output-file dest-file #:exists 'update))
|
(define-values (i o) (open-input-output-file dest-file #:exists 'update))
|
||||||
|
|
|
@ -77,6 +77,54 @@ static char *get_self_path()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ELF_FIND_BOOT_SECTION
|
||||||
|
# include <elf.h>
|
||||||
|
# include <fcntl.h>
|
||||||
|
|
||||||
|
static long find_boot_section(char *me)
|
||||||
|
{
|
||||||
|
int fd, i;
|
||||||
|
Elf64_Ehdr e;
|
||||||
|
Elf64_Shdr s;
|
||||||
|
char *strs;
|
||||||
|
|
||||||
|
fd = open(me, O_RDONLY, 0);
|
||||||
|
if (fd == -1) return 0;
|
||||||
|
|
||||||
|
if (read(fd, &e, sizeof(e)) == sizeof(e)) {
|
||||||
|
lseek(fd, e.e_shoff + (e.e_shstrndx * e.e_shentsize), SEEK_SET);
|
||||||
|
if (read(fd, &s, sizeof(s)) != sizeof(s)) {
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
strs = (char *)malloc(s.sh_size);
|
||||||
|
lseek(fd, s.sh_offset, SEEK_SET);
|
||||||
|
if (read(fd, strs, s.sh_size) != s.sh_size) {
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < e.e_shnum; i++) {
|
||||||
|
lseek(fd, e.e_shoff + (i * e.e_shentsize), SEEK_SET);
|
||||||
|
if (read(fd, &s, sizeof(s)) != sizeof(s)) {
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!strcmp(strs + s.sh_name, ".rackboot")) {
|
||||||
|
close(fd);
|
||||||
|
return s.sh_offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
static char *get_self_path()
|
static char *get_self_path()
|
||||||
{
|
{
|
||||||
|
@ -129,6 +177,16 @@ int main(int argc, char **argv)
|
||||||
memcpy(&pos2, boot_file_data + boot_file_offset + 4, sizeof(pos2));
|
memcpy(&pos2, boot_file_data + boot_file_offset + 4, sizeof(pos2));
|
||||||
memcpy(&pos3, boot_file_data + boot_file_offset + 8, sizeof(pos2));
|
memcpy(&pos3, boot_file_data + boot_file_offset + 8, sizeof(pos2));
|
||||||
|
|
||||||
|
#ifdef ELF_FIND_BOOT_SECTION
|
||||||
|
{
|
||||||
|
long boot_offset;
|
||||||
|
boot_offset = find_boot_section(self);
|
||||||
|
pos1 += boot_offset;
|
||||||
|
pos2 += boot_offset;
|
||||||
|
pos3 += boot_offset;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
racket_boot(argc, argv, self, segment_offset,
|
racket_boot(argc, argv, self, segment_offset,
|
||||||
extract_coldir(), extract_configdir(),
|
extract_coldir(), extract_configdir(),
|
||||||
pos1, pos2, pos3,
|
pos1, pos2, pos3,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user