Hello community,
here is the log from the commit of package neko for openSUSE:Factory checked in at 2017-06-07 09:55:15
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/neko (Old)
and /work/SRC/openSUSE:Factory/.neko.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "neko"
Wed Jun 7 09:55:15 2017 rev:3 rq:501077 version:2.1.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/neko/neko.changes 2016-11-04 21:00:32.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.neko.new/neko.changes 2017-06-07 09:55:16.503940883 +0200
@@ -1,0 +2,9 @@
+Sat Jun 05 03:09:00 UTC 2017 - andy@onthewings.net
+
+- Add patches from upstream for creating strippable binaries.
+ * nekovm-boot-c-1.patch
+ * nekovm-boot-c-2.patch
+- Make sure Ninja is used since there is problem building in
+ parallel using Make.
+
+-------------------------------------------------------------------
New:
----
nekovm-boot-c-1.patch
nekovm-boot-c-2.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ neko.spec ++++++
--- /var/tmp/diff_new_pack.2S9EWH/_old 2017-06-07 09:55:17.107855541 +0200
+++ /var/tmp/diff_new_pack.2S9EWH/_new 2017-06-07 09:55:17.111854976 +0200
@@ -33,6 +33,8 @@
Patch5: patch0005-mincoming-stack-boundary.patch
Patch6: patch0006-INCLUDEDIR.diff
Patch7: patch0007-CMAKE_INSTALL_LIBDIR.diff
+Patch8: nekovm-boot-c-1.patch
+Patch9: nekovm-boot-c-2.patch
BuildRequires: cmake
BuildRequires: ninja
BuildRequires: pkgconfig
@@ -93,16 +95,18 @@
%patch5 -p1
%patch6 -p1
%patch7 -p1
+%patch8 -p1
+%patch9 -p1
%build
%define __builder ninja
%cmake \
+ -G Ninja \
"-DWITH_NDLLS=std.ndll;zlib.ndll;mysql.ndll;mysql5.ndll;regexp.ndll;sqlite.ndll;ui.ndll;ssl.ndll" \
-DRELOCATABLERELOCATABLE=OFF \
-DRUN_LDCONFIG=OFF
-# make_jobs macro has not been defined in openSUSE_13.1
-%{!?make_jobs: %define make_jobs ninja -v %{?_smp_mflags} || %__make %{?_smp_mflags} VERBOSE=1}
-%make_jobs
+# make_jobs macro does not use ninja in openSUSE_13.2 / Leap_42.1
+%make_jobs || %__builder -v %{?_smp_mflags}
%check
@@ -111,7 +115,8 @@
%ctest
%install
-%cmake_install
+# cmake_install does not use ninja in openSUSE_13.2 / Leap_42.1
+%cmake_install || DESTDIR=%{buildroot} %__builder install -C build
%post -n libneko2 -p /sbin/ldconfig
++++++ nekovm-boot-c-1.patch ++++++
From a8c71ad97faaccff6c6e9e09eba2d5efd022f8dc Mon Sep 17 00:00:00 2001
From: Andy Li
Date: Wed, 11 May 2016 18:50:34 +0800
Subject: [PATCH] added `nekotools boot -c file.n` that outputs a c source file
---
CMakeLists.txt | 133 +++++++++++++--------
src/tools/nekoboot.neko | 309 +++++++++++++++++++++++++++++++++++++-----------
2 files changed, 322 insertions(+), 120 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7390d97..34b4a81 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1027,20 +1027,6 @@ endif(APPLE)
# compilers
# nekoc, nekoml, nekotools, and test.n
-if (WIN32)
- set(compilers_outputs
- ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.exe
- ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.exe
- ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekotools.exe
- )
-else()
- set(compilers_outputs
- ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc
- ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml
- ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekotools
- )
-endif()
-
if (CMAKE_HOST_WIN32)
set(set_neko_env set NEKOPATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set(neko_exec $)
@@ -1052,61 +1038,108 @@ else()
set(neko_exec LD_LIBRARY_PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} NEKOPATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} $)
endif()
-file(GLOB neko_files
- src/**/*.neko
+file(GLOB compilers_src
+ src/neko/*.nml
+ src/nekoml/*.nml
+ boot/*.n
)
-file(GLOB nml_files
- src/**/*.nml
-)
-
-add_custom_command(OUTPUT ${compilers_outputs} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test.n
+add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.n
COMMAND ${set_neko_env}
COMMAND ${neko_exec} ../boot/nekoml.n -nostd neko/Main.nml nekoml/Main.nml
- COMMAND ${neko_exec} ../boot/nekoc.n -link ../boot/nekoc.n neko/Main
- COMMAND ${neko_exec} ../boot/nekoc.n -link ../boot/nekoml.n nekoml/Main
-
- COMMAND ${CMAKE_COMMAND} -E copy ../boot/nekoc.n ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
- COMMAND ${CMAKE_COMMAND} -E copy ../boot/nekoml.n ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+ COMMAND ${neko_exec} ../boot/nekoc.n -link ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n neko/Main
+ COMMAND ${neko_exec} ../boot/nekoc.n -link ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.n nekoml/Main
- # compile some neko sources
+ VERBATIM
+ DEPENDS nekovm std.ndll ${compilers_src}
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src
+)
- COMMAND ${neko_exec} ../boot/nekoc.n tools/test.neko
+add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test.n
+ COMMAND ${set_neko_env}
+ COMMAND ${neko_exec} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n tools/test.neko
COMMAND ${CMAKE_COMMAND} -E copy tools/test.n ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
COMMAND ${CMAKE_COMMAND} -E remove tools/test.n
+ VERBATIM
+ DEPENDS nekovm std.ndll ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n ${CMAKE_SOURCE_DIR}/src/tools/test.neko
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src
+)
+add_custom_target(test.n ALL DEPENDS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test.n)
- COMMAND ${neko_exec} ../boot/nekoc.n tools/nekoboot.neko
- COMMAND ${neko_exec} ../boot/nekoml.n -nostd -p tools Tools.nml
- COMMAND ${neko_exec} ../boot/nekoc.n -link tools/nekotools.n Tools
- COMMAND ${CMAKE_COMMAND} -E copy tools/nekotools.n ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoboot.n
+ COMMAND ${set_neko_env}
+ COMMAND ${neko_exec} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n tools/nekoboot.neko
+ COMMAND ${CMAKE_COMMAND} -E copy tools/nekoboot.n ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+ # COMMAND ${CMAKE_COMMAND} -E remove tools/nekoboot.n
+ VERBATIM
+ DEPENDS nekovm std.ndll ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n ${CMAKE_SOURCE_DIR}/src/tools/nekoboot.neko
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src
+)
+
+file(GLOB nekotools_src
+ src/tools/*.nml
+)
- COMMAND ${neko_exec} tools/nekoboot ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n
- COMMAND ${neko_exec} tools/nekoboot ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.n
- COMMAND ${neko_exec} tools/nekoboot ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekotools.n
- COMMAND ${CMAKE_COMMAND} -E remove
+add_custom_command(OUTPUT ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekotools.n
+ COMMAND ${set_neko_env}
+ COMMAND ${neko_exec} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.n -nostd -p tools Tools.nml
+ COMMAND ${neko_exec} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n -link ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekotools.n Tools
+ VERBATIM
+ DEPENDS nekovm std.ndll
+ ${nekotools_src}
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.n
- ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekotools.n
+ ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoboot.n
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src
+)
+add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/nekoc.c
+ COMMAND ${set_neko_env}
+ COMMAND ${neko_exec} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoboot -c ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.c ${CMAKE_BINARY_DIR}
+ COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.c
VERBATIM
- DEPENDS nekovm std.ndll ${nml_files} ${neko_files}
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src
+ DEPENDS nekovm std.ndll ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoboot.n ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoc.n
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+)
+add_executable(nekoc ${CMAKE_BINARY_DIR}/nekoc.c)
+target_link_libraries(nekoc libneko)
+
+add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/nekoml.c
+ COMMAND ${set_neko_env}
+ COMMAND ${neko_exec} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoboot -c ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.n
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.c ${CMAKE_BINARY_DIR}
+ COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.c
+ VERBATIM
+ DEPENDS nekovm std.ndll ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoboot.n ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.n
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+)
+add_executable(nekoml ${CMAKE_BINARY_DIR}/nekoml.c)
+target_link_libraries(nekoml libneko)
+
+add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/nekotools.c
+ COMMAND ${set_neko_env}
+ COMMAND ${neko_exec} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoboot -c ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekotools.n
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekotools.c ${CMAKE_BINARY_DIR}
+ COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekotools.c
+ VERBATIM
+ DEPENDS nekovm std.ndll ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoboot.n ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekotools.n
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
+add_executable(nekotools ${CMAKE_BINARY_DIR}/nekotools.c)
+target_link_libraries(nekotools libneko)
file(GLOB CORE_NMLS RELATIVE ${CMAKE_SOURCE_DIR}/src src/core/*.nml)
set(nekoml_std ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.std)
add_custom_command(OUTPUT ${nekoml_std}
COMMAND ${set_neko_env}
- COMMAND ${neko_exec} ../boot/nekoml.n -nostd neko/Main.nml nekoml/Main.nml ${CORE_NMLS} -pack ${nekoml_std}
+ COMMAND ${neko_exec} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.n -nostd neko/Main.nml nekoml/Main.nml ${CORE_NMLS} -pack ${nekoml_std}
VERBATIM
- DEPENDS zlib.ndll ${compilers_outputs}
+ DEPENDS zlib.ndll ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nekoml.n
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src
)
-
-add_custom_target(compilers ALL
- DEPENDS ${compilers_outputs} ${nekoml_std}
-)
+add_custom_target(nekoml.std ALL DEPENDS ${nekoml_std})
#######################
@@ -1195,11 +1228,11 @@ else()
endif()
install (
- TARGETS nekovm
- DESTINATION ${DEST_BIN}
-)
-install (
- PROGRAMS ${compilers_outputs}
+ TARGETS
+ nekovm
+ nekoc
+ nekoml
+ nekotools
DESTINATION ${DEST_BIN}
)
install (
diff --git a/src/tools/nekoboot.neko b/src/tools/nekoboot.neko
index 97aaa41..0768f89 100644
--- a/src/tools/nekoboot.neko
+++ b/src/tools/nekoboot.neko
@@ -22,21 +22,158 @@
// primitives
-elf_update_section_header = $loader.loadprim("std@elf_update_section_header_for_bytecode",3);
-file_contents = $loader.loadprim("std@file_contents",1);
-file_open = $loader.loadprim("std@file_open",2);
-file_write = $loader.loadprim("std@file_write",4);
-file_write_char = $loader.loadprim("std@file_write_char",2);
-file_close = $loader.loadprim("std@file_close",1);
-command = $loader.loadprim("std@sys_command",1);
-system = $loader.loadprim("std@sys_string",0)();
-cwd = $loader.loadprim("std@get_cwd",0)();
-get_env = $loader.loadprim("std@get_env",1);
-string_split = $loader.loadprim("std@string_split",2);
+var c_src = "#include
+#include
+#include
+#include \"neko_vm.h\"
+#include \"neko_elf.h\"
+#ifdef NEKO_WINDOWS
+# include
+#else
+# include
+#endif
+#ifdef NEKO_MAC
+# include
+# include
+#endif
+#ifdef NEKO_BSD
+# include
+# include
+#endif
+#ifdef NEKO_POSIX
+# include
+#endif
+
+#define default_loader neko_default_loader
+static FILE *self;
+unsigned char program[] = %s;
+unsigned int program_len = %d;
+unsigned int program_pos = 0;
+
+static void report( neko_vm *vm, value exc, int isexc ) {
+ int i;
+ buffer b = alloc_buffer(NULL);
+ value st = neko_exc_stack(vm);
+ for(i=0;i available) mlen = available;
+ memcpy(val_string(str)+val_int(pos), prog, mlen);
+ program_pos += mlen;
+ return alloc_int(mlen);
+}
+
+/*
+ C functions corresponding to the following Neko code :
+
+ module_read = $loader.loadprim(\"std@module_read\",2);
+ module_exec = $loader.loadprim(\"std@module_exec\",1);
+ module_val = module_read(read_bytecode,$loader);
+ module_exec(module_val);
+
+*/
+
+int neko_execute_self( neko_vm *vm, value mload ) {
+ value args[] = { alloc_string(\"std@module_read\"), alloc_int(2) };
+ value args2[] = { alloc_string(\"std@module_exec\"), alloc_int(1) };
+ value args3[] = { alloc_function(read_bytecode,3,\"boot_read_bytecode\"), mload };
+ value exc = NULL;
+ value module_read, module_exec, module_val;
+ module_read = val_callEx(mload,val_field(mload,val_id(\"loadprim\")),args,2,&exc);
+ if( exc != NULL ) {
+ report(vm,exc,1);
+ return 1;
+ }
+ module_exec = val_callEx(mload,val_field(mload,val_id(\"loadprim\")),args2,2,&exc);
+ if( exc != NULL ) {
+ report(vm,exc,1);
+ return 1;
+ }
+ module_val = val_callEx(val_null,module_read,args3,2,&exc);
+ fclose(self);
+ if( exc != NULL ) {
+ report(vm,exc,1);
+ return 1;
+ }
+ alloc_field(val_field(mload,val_id(\"cache\")),val_id(\"_self\"),module_val);
+ val_callEx(val_null,module_exec,&module_val,1,&exc);
+ if( exc != NULL ) {
+ report(vm,exc,1);
+ return 1;
+ }
+ return 0;
+}
+
+#ifdef NEKO_POSIX
+static void handle_signal( int signal ) {
+ if( signal == SIGPIPE )
+ val_throw(alloc_string(\"Broken pipe\"));
+ else
+ val_throw(alloc_string(\"Segmentation fault\"));
+}
+#endif
+
+int main( int argc, char *argv[] ) {
+ neko_vm *vm;
+ value mload;
+ int r;
+ neko_global_init();
+ vm = neko_vm_alloc(NULL);
+ neko_vm_select(vm);
+
+ mload = default_loader(argv+1,argc-1);
+ r = neko_execute_self(vm,mload);
+ if( mload != NULL && val_field(mload,val_id(\"dump_prof\")) != val_null )
+ val_ocall0(mload,val_id(\"dump_prof\"));
+ vm = NULL;
+ mload = NULL;
+ neko_vm_select(NULL);
+ neko_global_free();
+ return r;
+}";
+
+var elf_update_section_header = $loader.loadprim("std@elf_update_section_header_for_bytecode",3);
+var file_contents = $loader.loadprim("std@file_contents",1);
+var file_open = $loader.loadprim("std@file_open",2);
+var file_write = $loader.loadprim("std@file_write",4);
+var file_write_char = $loader.loadprim("std@file_write_char",2);
+var file_close = $loader.loadprim("std@file_close",1);
+var command = $loader.loadprim("std@sys_command",1);
+var system = $loader.loadprim("std@sys_string",0)();
+var cwd = $loader.loadprim("std@get_cwd",0)();
+var get_env = $loader.loadprim("std@get_env",1);
+var string_split = $loader.loadprim("std@string_split",2);
+var buffer_new = $loader.loadprim("std@buffer_new",0);
+var buffer_add = $loader.loadprim("std@buffer_add",2);
+var buffer_string = $loader.loadprim("std@buffer_string",1);
+var sprintf = $loader.loadprim("std@sprintf",2);
// find a substring from then end
-find = function(str,sub,pos) {
+var find = function(str,sub,pos) {
var l1 = $ssize(str);
var l2 = $ssize(sub);
var i = l1 - pos;
@@ -50,7 +187,7 @@ find = function(str,sub,pos) {
// find a file in a path
-find_exe_in_path = function(path,file) {
+var find_exe_in_path = function(path,file) {
while( path != null ) {
try {
var s = file_contents(path[0]+file);
@@ -64,7 +201,7 @@ find_exe_in_path = function(path,file) {
$throw("The bootable executable file was not found : "+file);
}
-find_exe_in_paths = function(paths,file) {
+var find_exe_in_paths = function(paths,file) {
var i = 0;
var len = $asize(paths);
while( i < len ) {
@@ -80,62 +217,94 @@ find_exe_in_paths = function(paths,file) {
// bytecode = first argument
var args = $loader.args;
-var exe_ext = switch system { "Windows" => ".exe" default => "" };
-var boot_exe = "neko" + exe_ext;
-if( args[0] == "-b" ) {
- boot_exe = args[1];
- args = $asub(args,2,$asize(args)-2);
-}
-if( $asize(args) != 1 )
- $throw("Need bytecode argument");
-var file = args[0];
-var bytecode = file_contents(file);
-
-// load boot binary
-var path_sep = switch system {
- "Windows" => ";"
- default => ":"
-}
-var path = string_split(get_env("PATH"), path_sep);
-var boot = find_exe_in_paths($array($array(cwd,null),$loader.path,path),boot_exe);
-var boot_size = $ssize(boot);
-
-var dot_pos = find(file,".",1);
-if( dot_pos != null )
- file = $ssub(file,0,dot_pos);
-
-// create executable file :
-// this is the content of boot.bin where is appended
-// the neko bytecode followed by 'NEKO' and the original exe size
-
-var out_name = file+exe_ext;
-var out = file_open(out_name,"wb");
-var bytecode_size = $ssize(bytecode);
-var pad_size = (4-(boot_size&0x3)) & 0x3;
-
-file_write(out,boot,0,boot_size);
-boot_size += pad_size;
-if( pad_size >= 3 ) file_write_char(out,0x00);
-if( pad_size >= 2 ) file_write_char(out,0x00);
-if( pad_size >= 1 ) file_write_char(out,0x00);
-file_write(out,bytecode,0,bytecode_size)
-file_write(out,"NEKO",0,4);
-file_write_char(out,boot_size & 0xFF);
-file_write_char(out,(boot_size >> 8) & 0xFF);
-file_write_char(out,(boot_size >> 16) & 0xFF);
-file_write_char(out,boot_size >>> 24);
-file_close(out);
-
-// set execution rights
-
-switch system {
- "Windows" => null
- default => command("chmod 755 "+out_name)
-}
+if( args[0] == "-c" ) {
+
+ var file = args[1];
+ var bytecode = file_contents(file);
+ var bytecode_len = $ssize(bytecode);
+ var program_buf = buffer_new();
+ buffer_add(program_buf, "{");
+ var i = 0;
+ while(true) {
+ buffer_add(program_buf, $sget(bytecode, i));
+ i += 1;
+ if (i < bytecode_len) {
+ buffer_add(program_buf, ",");
+ } else {
+ break;
+ }
+ }
+ buffer_add(program_buf, "}");
+
+ // write a C source that run the module using neko
+ var c_name = if ($ssub(file, $ssize(file)-2, 2) == ".n")
+ $ssub(file, 0, $ssize(file)-2) + ".c";
+ else
+ file+".c";
+ var c_file = file_open(c_name,"wb");
+ c_src = sprintf(c_src, $array(buffer_string(program_buf), bytecode_len, "%s"));
+ file_write(c_file, c_src, 0, $ssize(c_src));
+ file_close(c_file);
+
+} else {
+
+ var exe_ext = switch system { "Windows" => ".exe" default => "" };
+ var boot_exe = "neko" + exe_ext;
+ if( args[0] == "-b" ) {
+ boot_exe = args[1];
+ args = $asub(args,2,$asize(args)-2);
+ }
+ if( $asize(args) != 1 )
+ $throw("Need bytecode argument");
+ var file = args[0];
+ var bytecode = file_contents(file);
+
+ // load boot binary
+ var path_sep = switch system {
+ "Windows" => ";"
+ default => ":"
+ }
+ var path = string_split(get_env("PATH"), path_sep);
+ var boot = find_exe_in_paths($array($array(cwd,null),$loader.path,path),boot_exe);
+ var boot_size = $ssize(boot);
+
+ var dot_pos = find(file,".",1);
+ if( dot_pos != null )
+ file = $ssub(file,0,dot_pos);
+
+ // create executable file :
+ // this is the content of boot.bin where is appended
+ // the neko bytecode followed by 'NEKO' and the original exe size
+
+ var out_name = file+exe_ext;
+ var out = file_open(out_name,"wb");
+ var bytecode_size = $ssize(bytecode);
+ var pad_size = (4-(boot_size&0x3)) & 0x3;
+
+ file_write(out,boot,0,boot_size);
+ boot_size += pad_size;
+ if( pad_size >= 3 ) file_write_char(out,0x00);
+ if( pad_size >= 2 ) file_write_char(out,0x00);
+ if( pad_size >= 1 ) file_write_char(out,0x00);
+ file_write(out,bytecode,0,bytecode_size)
+ file_write(out,"NEKO",0,4);
+ file_write_char(out,boot_size & 0xFF);
+ file_write_char(out,(boot_size >> 8) & 0xFF);
+ file_write_char(out,(boot_size >> 16) & 0xFF);
+ file_write_char(out,boot_size >>> 24);
+ file_close(out);
+
+ // set execution rights
+
+ switch system {
+ "Windows" => null
+ default => command("chmod 755 "+out_name)
+ }
-// Update ELF section header (on platforms where that is appropriate) to protect
-// binary's bytecode from being removed by the strip program
+ // Update ELF section header (on platforms where that is appropriate) to protect
+ // binary's bytecode from being removed by the strip program
-var res = elf_update_section_header(out_name,boot_size,bytecode_size+8);
-if( res == 0 )
+ var res = elf_update_section_header(out_name,boot_size,bytecode_size+8);
+ if( res == 0 )
$print("Trouble updating elf section header; stripping binary may lead to problems!")
+}
\ No newline at end of file
++++++ nekovm-boot-c-2.patch ++++++
From fe87462d9c7a6ee27e28f5be5e4fc0ac87b34574 Mon Sep 17 00:00:00 2001
From: Andy Li
Date: Thu, 12 May 2016 15:56:02 +0800
Subject: [PATCH] nekotools boot -c: removed unused self variable and the
fclose that caused sigfault
---
src/tools/nekoboot.neko | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/tools/nekoboot.neko b/src/tools/nekoboot.neko
index 0768f89..be63beb 100644
--- a/src/tools/nekoboot.neko
+++ b/src/tools/nekoboot.neko
@@ -45,7 +45,6 @@ var c_src = "#include
#endif
#define default_loader neko_default_loader
-static FILE *self;
unsigned char program[] = %s;
unsigned int program_len = %d;
unsigned int program_pos = 0;
@@ -113,7 +112,6 @@ int neko_execute_self( neko_vm *vm, value mload ) {
return 1;
}
module_val = val_callEx(val_null,module_read,args3,2,&exc);
- fclose(self);
if( exc != NULL ) {
report(vm,exc,1);
return 1;