Giter VIP home page Giter VIP logo

static-julia's Introduction

NOTE: This repository is mainly for purposes of experimentation and no longer expected to be used going forward. juliac.jl has been merged into PackageCompiler.jl. Please install that package to use juliac.jl.


Static Julia Compiler

Building shared libraries and executables from Julia code.

Run juliac.jl -h for help:

usage: juliac.jl [-v] [-q] [-c] [-J <file>]
                 [--compile {yes|no|all|min}] [-C <target>]
                 [-O {0,1,2,3}] [-g {0,1,2}] [--inline {yes|no}]
                 [--check-bounds {yes|no}] [--math-mode {ieee,fast}]
                 [--depwarn {yes|no|error}] [-a] [-o] [-s] [-e] [-j]
                 [--version] [-h] juliaprog [cprog] [builddir]

Static Julia Compiler

positional arguments:
  juliaprog             Julia program to compile
  cprog                 C program to compile (required only when
                        building an executable; if not provided a
                        minimal standard program is used)
  builddir              build directory, either absolute or relative
                        to the Julia program directory (default:
                        "builddir")

optional arguments:
  -v, --verbose         increase verbosity
  -q, --quiet           suppress non-error messages
  -c, --clean           delete builddir
  -J, --sysimage <file>
                        start up with the given system image file
  --compile {yes|no|all|min}
                        enable or disable JIT compiler, or request
                        exhaustive compilation
  -C, --cpu-target <target>
                        limit usage of CPU features up to <target>
  -O, --optimize {0,1,2,3}
                        set optimization level (type: Int64)
  -g {0,1,2}            set debugging information level (type: Int64)
  --inline {yes|no}     control whether inlining is permitted
  --check-bounds {yes|no}
                        emit bounds checks always or never
  --math-mode {ieee,fast}
                        set floating point optimizations
  --depwarn {yes|no|error}
                        set syntax and method deprecation warnings
  -a, --autodeps        automatically build required dependencies
  -o, --object          build object file
  -s, --shared          build shared library
  -e, --executable      build executable file
  -j, --julialibs       sync Julia libraries to builddir
  --version             show version information and exit
  -h, --help            show this help message and exit

examples:
  juliac.jl -vae hello.jl        # verbose, build executable and deps
  juliac.jl -vae hello.jl prog.c # embed into user defined C program
  juliac.jl -qo hello.jl         # quiet, build object file only
  juliac.jl -vosej hello.jl      # build all and sync Julia libs

Notes

  1. The juliac.jl script uses the ArgParse package, make sure it is installed.

  2. On Windows install Cygwin and the mingw64-x86_64-gcc-core package, see:
    https://github.com/JuliaLang/julia/blob/master/README.windows.md

  3. A shared library containing the system image libhello.so, and a driver binary hello are created in the builddir directory. Running hello produces the following output:

   $ ./hello
   hello, world
   f() = -0.37549581296986956
       ┌─────────────────────────────────────────────────┐
   100 │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠎│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⠁⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠊⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠔⠁⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠔⠁⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠊⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠤⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠔⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠤⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠤⠒⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⠔⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⢀⣀⠤⠔⠊⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
     0 │⣀⠤⠤⠔⠒⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       └─────────────────────────────────────────────────┘
       1                                       10

Under the hood

The juliac.jl script uses the --output-o switch to compile the user script into object code, and then builds it into the system image specified by the -J switch. This prepares an object file, which is then linked into a shared library containing the system image and user code. A driver script such as the one in program.c can then be used to build a binary that runs the julia code.

Instead of a driver script, the generated system image can be embedded into a larger program following the embedding examples and relevant sections in the Julia manual. Note that the name of the generated system image ("libhello" for hello.jl) is accessible from C in the preprocessor macro JULIAC_PROGRAM_LIBNAME.

With Julia 0.7, a single large binary can be created, which does not require the driver program to load the shared library. An example of that is in program2.c, where the image file is the binary itself.

For more information on static Julia compilation see:
https://juliacomputing.com/blog/2016/02/09/static-julia.html

For more information on embedding Julia see:
https://github.com/JuliaLang/julia/blob/master/doc/src/manual/embedding.md

static-julia's People

Contributors

lucatrv avatar mauro3 avatar nhdaly avatar petr-hlavenka avatar timholy avatar tkoolen avatar vtjnash avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

static-julia's Issues

After #54, default compile doesn't build julia object.

After the changes in #54, which seem really cool, building without -a doesn't seem to do anything useful:

When I try compiling a brand-new file, it doesn't build the intermediate required steps. It skips the object and shared targets, which are necessary to build an executable?:

julia ~/src/static-julia/juliac.jl -v -e hello3.jl
Julia program file:
  "/Users/daly/src/static-julia/hello3.jl"
C program file:
  "/Users/daly/src/static-julia/program.c"
Build directory:
  "/Users/daly/src/static-julia/builddir"
Change to build directory
Build executable file "hello3":
  `gcc -m64 -o hello3 /Users/daly/src/static-julia/program.c libhello3.dylib -std=gnu99 -I/Applications/Julia-0.6.app/Contents/Resources/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC '-DJULIAC_PROGRAM_LIBNAME="libhello3"' -L/Appl
ications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia -ljulia -Wl,-rpath,@executable_path`
clang: error: no such file or directory: 'libhello3.dylib'
ERROR: LoadError: failed process: Process(`gcc -m64 -o hello3 /Users/daly/src/static-julia/program.c libhello3.dylib -std=gnu99 -I/Applications/Julia-0.6.app/Contents/Resources/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC '-DJUL
IAC_PROGRAM_LIBNAME="libhello3"' -L/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia -$
julia -Wl,-rpath,@executable_path`, ProcessExited(1)) [1]
Stacktrace:
 [1] pipeline_error(::Base.Process) at ./process.jl:682
 [2] run(::Cmd) at ./process.jl:651
 [3] julia_compile(::String, ::Void, ::String, ::Bool, ::Bool, ::Bool, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Bool, ::Bool, ::Bool, ::Bool, ::Bool) at /Users/daly/src/static-julia/juliac.jl:261
 [4] main(::Array{String,1}) at /Users/daly/src/static-julia/juliac.jl:121
 [5] include_from_node1(::String) at ./loading.jl:576
 [6] include(::String) at ./sysimg.jl:14
 [7] process_options(::Base.JLOptions) at ./client.jl:305
 [8] _start() at ./client.jl:371
while loading /Users/daly/src/static-julia/juliac.jl, in expression starting on line 289

Similarly, when I modify an already compiled file, it doesn't rebuild the object file, so the resulting executable is unchanged:

echo "" > hello.jl; julia ~/src/static-julia/juliac.jl -v -e hello.jl && ./builddir/hello
Julia program file:
  "/Users/daly/src/static-julia/hello.jl"
C program file:
  "/Users/daly/src/static-julia/program.c"
Build directory:
  "/Users/daly/src/static-julia/builddir"
Change to build directory
Build executable file "hello":
  `gcc -m64 -o hello /Users/daly/src/static-julia/program.c libhello.dylib -std=gnu99 -I/Applications/Julia-0.6.app/Contents/Resources/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC '-DJULIAC_PROGRAM_LIBNAME="libhello"' -L/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia -ljulia -Wl,-rpath,@executable_path`
hello, world
f() = -1.0614533458782593
       ┌────────────────────────────────────────┐
   100 │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠎│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⠁⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠊⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠔⠁⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠔⠁⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠊⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠤⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠔⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠤⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠤⠒⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⠔⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⢀⣀⠤⠔⠊⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
     0 │⣀⠤⠤⠔⠒⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       └────────────────────────────────────────┘
       1                                       10

It seems to me that if we're going to default to only building the "required" pieces (which is good), that should be paired with logic that detects which pieces are required based on timestamp. That's hard, I know, but until that's in place this feels like an ease-of-use regression. (At the very least, we could make -a the default. Or at least it should be documented that it's required for now.)

Program file can only be named hello.jl?

It seems that if the program file is not named hello.jl, then things can go wrong.

Contents of my hello.jl:

module Hello

using StaticArrays

Base.@ccallable function julia_main(ARGS::Vector{String})::Cint
    v = SVector(1, 2)
    @show v
    0
end

end # module

Using juliac.jl and running the resulting executable works fine, but if I cp hello.jl hello2.jl, run juliac.jl on hello2.jl, and run the resulting binary, I get the following segfault:

twan@tk-loco:~/code/static-julia$ ./hello2

signal (11): Segmentation fault
while loading no file, in expression starting on line 0
unknown function (ip: 0xffffffffffffffff)
main at ./hello2 (unknown line)
__libc_start_main at /build/glibc-bfm8X4/glibc-2.23/csu/../csu/libc-start.c:291
_start at ./hello2 (unknown line)
Allocations: 884837 (Pool: 883603; Big: 1234); GC: 0
Segmentation fault (core dumped)
julia> versioninfo()
Julia Version 0.6.0
Commit 9036443 (2017-06-19 13:05 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i7-6950X CPU @ 3.00GHz
  WORD_SIZE: 64
  BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)
  LAPACK: libopenblas64_
  LIBM: libopenlibm
  LLVM: libLLVM-3.9.1 (ORCJIT, broadwell)

julia> Pkg.status("StaticArrays")
 - StaticArrays                  0.6.2

exec format error: ./hello.o in MacOS (and It takes so long time to compile!!!)

OS: Mac OS Sierra 10.12.6
julia version 0.6.2

-> % gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.38)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

zh@MacBookProZh [04:18:52] [/Volumes/OS_X_Files/git/static-julia] [master *]
-> % ls
README.md  hello.jl   juliac.jl  program.c  program2.c
zh@MacBookProZh [04:19:07] [/Volumes/OS_X_Files/git/static-julia] [master *]
-> %
zh@MacBookProZh [04:19:15] [/Volumes/OS_X_Files/git/static-julia] [master *]
-> % julia juliac.jl -vae hello.jl
Julia program file:
  "/Volumes/OS_X_Files/git/static-julia/hello.jl"
C program file:
  "/Volumes/OS_X_Files/git/static-julia/program.c"
Build directory:
  "/Volumes/OS_X_Files/git/static-julia/builddir"
Make build directory
Change to build directory
Build ".ji" files:
  `/Applications/julia-0.6.app/Contents/Resources/julia/bin/julia -Ccore2 -J/Applications/julia-0.6.app/Contents/Resources/julia/lib/julia/sys.dylib --compile=yes --depwarn=yes --startup-file=no -e '
  VERSION >= v"0.7+" && Base.init_load_path("/Applications/julia-0.6.app/Contents/Resources/julia/bin") # initialize location of site-packages
  empty!(Base.LOAD_CACHE_PATH) # reset / remove any builtin paths
  push!(Base.LOAD_CACHE_PATH, abspath("tmp_v0.6.2")) # enable usage of precompiled files
  include("/Volumes/OS_X_Files/git/static-julia/hello.jl") # include "julia_program" file
  empty!(Base.LOAD_CACHE_PATH) # reset / remove build-system-relative paths'`
Build object file "hello.o":
  `/Applications/julia-0.6.app/Contents/Resources/julia/bin/julia -Ccore2 -J/Applications/julia-0.6.app/Contents/Resources/julia/lib/julia/sys.dylib --compile=yes --depwarn=yes --startup-file=no --output-o tmp_v0.6.2/hello.o -e '
  VERSION >= v"0.7+" && Base.init_load_path("/Applications/julia-0.6.app/Contents/Resources/julia/bin") # initialize location of site-packages
  empty!(Base.LOAD_CACHE_PATH) # reset / remove any builtin paths
  push!(Base.LOAD_CACHE_PATH, abspath("tmp_v0.6.2")) # enable usage of precompiled files
  include("/Volumes/OS_X_Files/git/static-julia/hello.jl") # include "julia_program" file
  empty!(Base.LOAD_CACHE_PATH) # reset / remove build-system-relative paths'`
Build shared library "libhello.dylib":
  `gcc -m64 -shared -o libhello.dylib tmp_v0.6.2/hello.o -std=gnu99 -I/Applications/julia-0.6.app/Contents/Resources/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC -L/Applications/julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/julia-0.6.app/Contents/Resources/julia/lib/julia -ljulia -Wl,-install_name,@rpath/libhello.dylib`
Build executable file "hello":
  `gcc -m64 -o hello /Volumes/OS_X_Files/git/static-julia/program.c libhello.dylib -std=gnu99 -I/Applications/julia-0.6.app/Contents/Resources/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC -L/Applications/julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/julia-0.6.app/Contents/Resources/julia/lib/julia -ljulia -Wl,-rpath,@executable_path`
zh@MacBookProZh [04:22:55] [/Volumes/OS_X_Files/git/static-julia] [master *]
-> % ls
README.md  builddir   hello.jl   juliac.jl  program.c  program2.c
zh@MacBookProZh [04:22:59] [/Volumes/OS_X_Files/git/static-julia] [master *]
-> % cd builddir/tmp_v0.6.2
zh@MacBookProZh [04:23:03] [/Volumes/OS_X_Files/git/static-julia/builddir/tmp_v0.6.2] [master *]
-> % ls
Compat.ji            QuadGK.ji            StatsBase.ji
DataStructures.ji    Rmath.ji             StatsFuns.ji
Distributions.ji     SortingAlgorithms.ji UnicodePlots.ji
PDMats.ji            SpecialFunctions.ji  hello.o
zh@MacBookProZh [04:23:10] [/Volumes/OS_X_Files/git/static-julia/builddir/tmp_v0.6.2] [master *]
-> % chmod u+x hello.o
zh@MacBookProZh [04:23:17] [/Volumes/OS_X_Files/git/static-julia/builddir/tmp_v0.6.2] [master *]
-> % ./hello.o
zsh: exec format error: ./hello.o
zh@MacBookProZh [04:23:19] [/Volumes/OS_X_Files/git/static-julia/builddir/tmp_v0.6.2] [master *]
->

Feature request: Automatically generate header file

This script is compiling Julia functions into an .so file (on Linux). So the functions can be called like C functions from other programming languages. What is missing is the automatic generation of the correct .h file with the function prototypes. While this can be done manually, that is a tedious and error prone task.

Compilation fails under Windows10

I tried using juliac.jl and get this error:

Build object file "hello.o":
`'C:\Users\Christian\AppData\Local\Julia-0.6.1\bin\julia.exe' -Cx86-64 '-JC:\Users\Christian\AppData\Local\Julia-0.6.1\lib\julia\sys.dll' --compile=yes --depwarn=yes --startup-file=no --output-o hello.o -e 'include("C:\\Users\\Christian\
\Documents\\Julia\\static-julia-master\\hello.jl"); push!(Base.LOAD_CACHE_PATH, "C:\\Users\\Christian\\.julia\\lib\\v0.6"); empty!(Base.LOAD_CACHE_PATH)'`
Build shared library "libhello.dll":
`'C:\Users\Christian\.julia\v0.6\WinRPM\deps\usr\x86_64-w64-mingw32\sys-root\mingw\bin\gcc.exe' -m64 -shared -o libhello.dll hello.o -std=gnu99 '-IC:\Users\Christian\AppData\Local\Julia-0.6.1\include\julia' -DJULIA_ENABLE_THREADING=1 '-L
C:\Users\Christian\AppData\Local\Julia-0.6.1\bin' -Wl,--stack,8388608 -ljulia -lopenlibm -Wl,--export-all-symbols`
Build executable file "hello.exe":
`'C:\Users\Christian\.julia\v0.6\WinRPM\deps\usr\x86_64-w64-mingw32\sys-root\mingw\bin\gcc.exe' -m64 -o hello.exe 'C:\Users\Christian\Documents\Julia\static-julia-master\program.c' libhello.dll -std=gnu99 '-IC:\Users\Christian\AppData\Lo
cal\Julia-0.6.1\include\julia' -DJULIA_ENABLE_THREADING=1 '-LC:\Users\Christian\AppData\Local\Julia-0.6.1\bin' -Wl,--stack,8388608 -ljulia -lopenlibm`
ERROR: LoadError: failed process: Process(`'C:\Users\Christian\.julia\v0.6\WinRPM\deps\usr\x86_64-w64-mingw32\sys-root\mingw\bin\gcc.exe' -m64 -o hello.exe 'C:\Users\Christian\Documents\Julia\static-julia-master\program.c' libhello.dll -
std=gnu99 '-IC:\Users\Christian\AppData\Local\Julia-0.6.1\include\julia' -DJULIA_ENABLE_THREADING=1 '-LC:\Users\Christian\AppData\Local\Julia-0.6.1\bin' -Wl,--stack,8388608 -ljulia -lopenlibm`, ProcessExited(1)) [1]
Stacktrace:
 [1] pipeline_error(::Base.Process) at .\process.jl:682
 [2] run(::Cmd) at .\process.jl:651
 [3] julia_compile(::String, ::String, ::Bool, ::Bool, ::Bool, ::Bool, ::Bool, ::Bool, ::Bool) at C:\Users\Christian\Documents\Julia\static-julia-master\juliac.jl:171
 [4] main(::Array{String,1}) at C:\Users\Christian\Documents\Julia\static-julia-master\juliac.jl:52
 [5] include_from_node1(::String) at .\loading.jl:576
 [6] include(::String) at .\sysimg.jl:14
 [7] process_options(::Base.JLOptions) at .\client.jl:305
 [8] _start() at .\client.jl:371
while loading C:\Users\Christian\Documents\Julia\static-julia-master\juliac.jl, in expression starting on line 215

MinGW was installed using WinRPM, i hardcoded the path to gcc.exe as my system could not find it otherwise.
Any idea what i am doing wrong?

Document what the result is in the README

I am still a little uncertain about what it is. Does the binary have the Julia runtime with it? Is everything AOT compiled? Can it compile extra functions as necessary, depending on the input? Are generated functions allowed? I would like to see this kind of stuff explained in the README.

Passing command line arguments

Hi,

I've just tried to make a binary which accepts command line arguments and I get segfaults which has led me to notice:

In hello.jl:

Base.@ccallable function julia_main(ARGS::Vector{String})::Cint
    println("hello, world")
    @show f()
    println(lineplot(1:10, (1:10).^2))
    return 0
end

So I should expect to accept ARGS and pass it through to use with say ArgParse.jl.
However, when I look at program.c:

int main(int argc, char *argv[])
{
    intptr_t v;

    // Initialize Julia
    uv_setup_args(argc, argv); // no-op on Windows
    libsupport_init();
    jl_options.image_file = "libhello";
    julia_init(JL_IMAGE_CWD);

    // Do some work
    julia_main();

    // Cleanup and graceful exit
    jl_atexit_hook(0);
    return 0;
}

Nothing is passed to julia_main when it is invoked - perhaps why I'm getting segfault!? So does the call of julia_main() need to be altered to accept some arguments? If so, how?

How to get ARGS from CLI

After compiled, How can I get ARGS from command line? For example, when I run ./hello abc, How to get abc in my code? I can use ARGS in script, but when the code is compiled to binary, it is not work.

Enabling CI

We should get CI setup for this repo at some point.

undefined reference to `julia_main'

Hi, I encountered an error and tried to find a solution but, I could not find it until now.

I will be happy if you give me some advice.

julia juliac.jl hello.jl "C:\Users\Donghyeon Kim\AppData\Local\Julia-0.6.0" "C:\Users\Donghyeon Kim\AppData\Local\Julia-0.6.0"
Program File : hello.jl
Julia Install Path: C:\Users\Donghyeon Kim\AppData\Local\Julia-0.6.0
C:\Users\DONGHY~1\AppData\Local\Temp\ccDaHl7Q.o:program.c:(.text+0x4d): undefined reference to julia_main' collect2.exe: error: ld returned 1 exit status ERROR: LoadError: failed process: Process(x86_64-w64-mingw32-gcc -m64 program.c -o hello.exe libhello.dll -std=gnu99 '-IC:\Users\Donghyeon Kim\AppData\Local\Julia-0.6.0\include\julia' -DJULIA_ENABLE_THREADING=1 '-LC:\Users\Donghyeon Kim\AppData\Local\Julia-0.6.0\bin' -Wl,--stack,8388608 -ljulia -lopenlibm -lopenlibm '-Wl,-rpath,$ORIGIN'`, ProcessExited(1)) [1]
Stacktrace:
[1] pipeline_error(::Base.Process) at .\process.jl:682
[2] run(::Cmd) at .\process.jl:651
[3] compile(::String, ::String, ::String) at D:\workspace\Git\Julia_MshSimEngine\static-julia\juliac.jl:32
[4] include_from_node1(::String) at .\loading.jl:569
[5] include(::String) at .\sysimg.jl:14
[6] process_options(::Base.JLOptions) at .\client.jl:305
[7] _start() at .\client.jl:371
while loading D:\workspace\Git\Julia_MshSimEngine\static-julia\juliac.jl, in expression starting on line 51

Failure on Windows

It looks like the script doesn't automatically find the system compiler on Windows or use WinRPM.
This https://github.com/JuliaLang/julia/blob/master/contrib/build_sysimg.jl#L110 function would be helpful.

$ julia juliac.jl test.jl
Program file:
C:\Users\Mus\static-julia\test.jl
Change directory:
"C:\Users\Mus\static-julia\builddir"
Running command:
`'C:\Julia\Julia-0.6-latest\bin\julia.exe' -Cx86-64 '-JC:\Julia\Julia-0.6-latest\lib\julia\sys.dll' --compile=yes --depwarn=yes --startup-file=no --output-o test.o -e 'include("C:\\Users\\Mus\\static-julia\\test.jl"); push!(Base.LOAD_CACHE_PATH, "C:\\Users\\Mus\\.julia\\lib\\v0.6"); empty!(Base.LOAD_CACHE_PATH)'`
"HELLO" = "HELLO"
Running command:
`gcc -m64 -shared -o libtest.dll test.o -std=gnu99 '-IC:\Julia\Julia-0.6-latest\include\julia' -DJULIA_ENABLE_THREADING=1 '-LC:\Julia\Julia-0.6-latest\bin' -Wl,--stack,8388608 -ljulia -lopenlibm '-Wl,-rpath,$ORIGIN' -Wl,--export-all-symbols`
ERROR: LoadError: could not spawn `gcc -m64 -shared -o libtest.dll test.o -std=gnu99 '-IC:\Julia\Julia-0.6-latest\include\julia' -DJULIA_ENABLE_THREADING=1 '-LC:\Julia\Julia-0.6-latest\bin' -Wl,--stack,8388608 -ljulia -lopenlibm '-Wl,-rpath,$ORIGIN' -Wl,--export-all-symbols`: no such file or directory (ENOENT)
Stacktrace:
 [1] _jl_spawn(::String, ::Array{String,1}, ::Ptr{Void}, ::Base.Process, ::RawFD, ::RawFD, ::RawFD) at .\process.jl:360
 [2] #375 at .\process.jl:512 [inlined]
 [3] setup_stdio(::Base.##375#376{Cmd}, ::Tuple{RawFD,RawFD,RawFD}) at .\process.jl:499
 [4] #spawn#374(::Nullable{Base.ProcessChain}, ::Function, ::Cmd, ::Tuple{RawFD,RawFD,RawFD}) at .\process.jl:511
 [5] run(::Cmd) at .\process.jl:650
 [6] julia_compile(::String) at C:\Users\Mus\static-julia\juliac.jl:49
 [7] main() at C:\Users\Mus\static-julia\juliac.jl:64
 [8] include_from_node1(::String) at .\loading.jl:569
 [9] include(::String) at .\sysimg.jl:14
 [10] process_options(::Base.JLOptions) at .\client.jl:305
 [11] _start() at .\client.jl:371
while loading C:\Users\Mus\static-julia\juliac.jl, in expression starting on line 67

Base.InitError(mod=:LibGit2, error=ErrorException("error initializing LibGit2 module"))

I get this error running "hello":

fatal: error thrown and no exception handler available.                                                                                               
Base.InitError(mod=:LibGit2, error=ErrorException("error initializing LibGit2 module"))                                                               
rec_backtrace at /home/mauro/julia/julia-0.6/src/stackwalk.c:84                                                                                       
record_backtrace at /home/mauro/julia/julia-0.6/src/task.c:245                                                                                        
jl_throw at /home/mauro/julia/julia-0.6/src/task.c:564                                                                                                
__init__ at ./libgit2/libgit2.jl:920                                                                                                                  
unknown function (ip: 0x7fe0b9575e58)                                                                                                                 
jl_call_fptr_internal at /home/mauro/julia/julia-0.6/src/julia_internal.h:339 [inlined]                                                               
jl_call_method_internal at /home/mauro/julia/julia-0.6/src/julia_internal.h:358 [inlined]                                                             
jl_apply_generic at /home/mauro/julia/julia-0.6/src/gf.c:1933                                                                                         
jl_apply at /home/mauro/julia/julia-0.6/src/julia.h:1424 [inlined]                                                                                    
jl_module_run_initializer at /home/mauro/julia/julia-0.6/src/toplevel.c:87                                                                            
_julia_init at /home/mauro/julia/julia-0.6/src/init.c:733                                                                                             
julia_init at /home/mauro/julia/julia-0.6/src/task.c:297                                                                                              
main at ./hello (unknown line)                                                                                                                        
__libc_start_main at /usr/lib/libc.so.6 (unknown line)                                                                                                
_start at ./hello (unknown line)                                                                                                                      

Compilation completes without any problem. Julia 0.6, Linux

Can juliac compile(bootstrap) itself? "required argument juliaprog was not provided".

Windows CMD:

W:\git\static-julia>julia juliac.jl -vae juliac.jl
Julia program file:
  "W:\git\static-julia\juliac.jl"
C program file:
  "W:\git\static-julia\program.c"
Build directory:
  "W:\git\static-julia\builddir"
Change to build directory
Build ".ji" files:
  `'C:\Users\zh\AppData\Local\Julia-0.6.0\bin\julia.exe' -Cx86-64 '-JC:\Users\zh\AppData\Local\Julia-0.6.0\lib\julia\sys.dll' --compile=yes --depwarn=yes --startup-file=no -e '
  VERSION >= v"0.7+" && Base.init_load_path("C:\\Users\\zh\\AppData\\Local\\Julia-0.6.0\\bin") # initialize location of site-packages
  empty!(Base.LOAD_CACHE_PATH) # reset / remove any builtin paths
  push!(Base.LOAD_CACHE_PATH, abspath("tmp_v0.6.0")) # enable usage of precompiled files
  include("W:\\\\git\\\\static-julia\\\\juliac.jl") # include "julia_program" file
  empty!(Base.LOAD_CACHE_PATH) # reset / remove build-system-relative paths'`
required argument juliaprog was not provided
usage: juliac.jl [-v] [-q] [-c] [-J <file>]
                 [--compile {yes|no|all|min}] [-C <target>]
                 [-O {0,1,2,3}] [-g {0,1,2}] [--inline {yes|no}]
                 [--check-bounds {yes|no}] [--math-mode {ieee,fast}]
                 [--depwarn {yes|no|error}] [-a] [-o] [-s] [-e] [-j]
                 juliaprog [cprog] [builddir]
ERROR: LoadError: failed process: Process(`'C:\Users\zh\AppData\Local\Julia-0.6.0\bin\julia.exe' -Cx86-64 '-JC:\Users\zh\AppData\Local\Julia-0.6.0\lib\julia\sys.dll' --compile=yes --depwarn=yes --startup-file=no -e '
  VERSION >= v"0.7+" && Base.init_load_path("C:\\Users\\zh\\AppData\\Local\\Julia-0.6.0\\bin") # initialize location of site-packages
  empty!(Base.LOAD_CACHE_PATH) # reset / remove any builtin paths
  push!(Base.LOAD_CACHE_PATH, abspath("tmp_v0.6.0")) # enable usage of precompiled files
  include("W:\\\\git\\\\static-julia\\\\juliac.jl") # include "julia_program" file
  empty!(Base.LOAD_CACHE_PATH) # reset / remove build-system-relative paths'`, ProcessExited(1)) [1]
Stacktrace:
 [1] pipeline_error(::Base.Process) at .\process.jl:682
 [2] run(::Cmd) at .\process.jl:651
 [3] julia_compile(::String, ::Void, ::String, ::Bool, ::Bool, ::Bool, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Bool, ::Bool, ::Bool, ::Bool, ::Bool) at W:\git\static-julia\juliac.jl:227
 [4] main(::Array{String,1}) at W:\git\static-julia\juliac.jl:121
 [5] include_from_node1(::String) at .\loading.jl:569
 [6] include(::String) at .\sysimg.jl:14
 [7] process_options(::Base.JLOptions) at .\client.jl:305
 [8] _start() at .\client.jl:371
while loading W:\git\static-julia\juliac.jl, in expression starting on line 288

Windows WSL Ubuntu 16.04.3:

└─[$] julia juliac.jl -vae juliac.jl                                                                         [23:23:54]
Julia program file:
  "/mnt/w/git/static-julia/juliac.jl"
C program file:
  "/mnt/w/git/static-julia/program.c"
Build directory:
  "/mnt/w/git/static-julia/builddir"
Make build directory
Change to build directory
Build ".ji" files:
  `/home/zh/julia-0.6.2/bin/julia -Cx86-64 -J/home/zh/julia-0.6.2/lib/julia/sys.so --compile=yes --depwarn=yes --startup-file=no -e '
  VERSION >= v"0.7+" && Base.init_load_path("/home/zh/julia-0.6.2/bin") # initialize location of site-packages
  empty!(Base.LOAD_CACHE_PATH) # reset / remove any builtin paths
  push!(Base.LOAD_CACHE_PATH, abspath("tmp_v0.6.2")) # enable usage of precompiled files
  include("/mnt/w/git/static-julia/juliac.jl") # include "julia_program" file
  empty!(Base.LOAD_CACHE_PATH) # reset / remove build-system-relative paths'`
required argument juliaprog was not provided
usage: juliac.jl [-v] [-q] [-c] [-J <file>]
                 [--compile {yes|no|all|min}] [-C <target>]
                 [-O {0,1,2,3}] [-g {0,1,2}] [--inline {yes|no}]
                 [--check-bounds {yes|no}] [--math-mode {ieee,fast}]
                 [--depwarn {yes|no|error}] [-a] [-o] [-s] [-e] [-j]
                 juliaprog [cprog] [builddir]
ERROR: LoadError: failed process: Process(`/home/zh/julia-0.6.2/bin/julia -Cx86-64 -J/home/zh/julia-0.6.2/lib/julia/sys.so --compile=yes --depwarn=yes --startup-file=no -e '
  VERSION >= v"0.7+" && Base.init_load_path("/home/zh/julia-0.6.2/bin") # initialize location of site-packages
  empty!(Base.LOAD_CACHE_PATH) # reset / remove any builtin paths
  push!(Base.LOAD_CACHE_PATH, abspath("tmp_v0.6.2")) # enable usage of precompiled files
  include("/mnt/w/git/static-julia/juliac.jl") # include "julia_program" file
  empty!(Base.LOAD_CACHE_PATH) # reset / remove build-system-relative paths'`, ProcessExited(1)) [1]
Stacktrace:
 [1] pipeline_error(::Base.Process) at ./process.jl:682
 [2] run(::Cmd) at ./process.jl:651
 [3] julia_compile(::String, ::Void, ::String, ::Bool, ::Bool, ::Bool, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Void, ::Bool, ::Bool, ::Bool, ::Bool, ::Bool) at /mnt/w/git/static-julia/juliac.jl:227
 [4] main(::Array{String,1}) at /mnt/w/git/static-julia/juliac.jl:121
 [5] include_from_node1(::String) at ./loading.jl:576
 [6] include(::String) at ./sysimg.jl:14
 [7] process_options(::Base.JLOptions) at ./client.jl:305
 [8] _start() at ./client.jl:371
while loading /mnt/w/git/static-julia/juliac.jl, in expression starting on line 288

Project status and goals

Hi,
I am very excited about what I think you are trying to achieve with this project.
However, I am not sure if my impression is correct and I have trouble evaluating the maturity of this project.
Could you say a few words on the following questions?

  • Does static-julia mainly aim to provide speed by compiling ahead of time or is this more about the distribution of libraries and executables?
  • How portable is a library or executable created with this project? Does it still depend on libjulia?
  • Can I build a Python wheel library that doesn't require Julia to be installed on the user's computer with this project?
  • Is this an independent project or is it part of the effort for Julia 1.0? Are you "almost done" or "just starting out"?

Best regards,
Matthias

Segmentation fault

I finally successfully compile the julia script, but when I run it , I get a segmentation fault

$ ./2584
WARNING: using Base.show in module Main conflicts with an existing identifier.

signal (11): Segmentation fault
while loading no file, in expression starting on line 0
jl_is_leaf_type_ at /home/centos/buildbot/slave/package_tarball64/build/src/julia.h:993 [inlined]
inst_datatype at /home/centos/buildbot/slave/package_tarball64/build/src/jltypes.c:1017
jl_inst_concrete_tupletype_v at /home/centos/buildbot/slave/package_tarball64/build/src/jltypes.c:1230
jl_f_tuple at /home/centos/buildbot/slave/package_tarball64/build/src/builtins.c:568
#sprint#228 at ./strings/io.jl:0
julia_main at /home/peter/work/HW/GT/proj1/pj-1/2584.jl:112
julia_main at /home/peter/work/HW/GT/proj1/pj-1/builddir/lib2584.so (unknown line)
main at ./2584 (unknown line)
__libc_start_main at /build/glibc-bfm8X4/glibc-2.23/csu/../csu/libc-start.c:291
_start at ./2584 (unknown line)
Allocations: 864516 (Pool: 863388; Big: 1128); GC: 0
Segmentation fault

I have no idea what's going on.
Any Suggestion?

Program file (e.g. hello.jl) currently needs to be in static-julia directory

Otherwise you get

twan@tk-loco:~/code/static-julia$ julia juliac.jl ~/code/RigidBodyDynamics/v0.6/RigidBodyDynamics/hello.jl /opt/julia-0.6/ $JULIA_PKGDIR 
Program File : /home/twan/code/RigidBodyDynamics/v0.6/RigidBodyDynamics/hello.jl
Julia Install Path: /opt/julia-0.6/
/usr/bin/ld: cannot open output file lib/home/twan/code/RigidBodyDynamics/v0.so: No such file or directory
collect2: error: ld returned 1 exit status
ERROR: LoadError: failed process: Process(`g++ -m64 -fPIC -shared -o lib/home/twan/code/RigidBodyDynamics/v0.so /home/twan/code/RigidBodyDynamics/v0.o -L/opt/julia-0.6/lib -Wl,--export-dynamic -Wl,-rpath,/opt/julia-0.6/lib -Wl,-rpath,/opt/julia-0.6/lib/julia -ljulia`, ProcessExited(1)) [1]
Stacktrace:
 [1] pipeline_error(::Base.Process) at ./process.jl:682
 [2] run(::Cmd) at ./process.jl:651
 [3] compile(::String, ::String, ::String) at /home/twan/code/static-julia/juliac.jl:34
 [4] include_from_node1(::String) at ./loading.jl:569
 [5] include(::String) at ./sysimg.jl:14
 [6] process_options(::Base.JLOptions) at ./client.jl:305
 [7] _start() at ./client.jl:371
while loading /home/twan/code/static-julia/juliac.jl, in expression starting on line 51

Failure on windows - other issue

I have an issue running the example with static-julia (today's master).
Windows 7, 64 bit, JuliaPro 0.6.0.1, cygwin (latest).

Run from cygwin's Bash:

$ c:/JuliaPro-0.6.0.1/Julia-0.6.0/bin/julia.exe juliac.jl hello.jl
Program file:
C:\Users\phlavenk\Documents\Python_Scripts\static-julia-master\hello.jl
Make directory:
"C:\Users\phlavenk\Documents\Python_Scripts\static-julia-master\builddir"
Change directory:
"C:\Users\phlavenk\Documents\Python_Scripts\static-julia-master\builddir"
Running command:
`'C:\JuliaPro-0.6.0.1\Julia-0.6.0\bin\julia.exe' -Cx86-64 '-JC:\JuliaPro-0.6.0.1\Julia-0.6.0\lib\julia\sys.dll' --compile=yes --depwarn=yes --startup-file=no --output-o hello.o -e 'include("C:\\Users\\phlavenk\\Documents\\Python_Scripts\\static-julia-master\\hello.jl"); push!(Base.LOAD_CACHE_PATH, "C:\\JuliaPro-0.6.0.1\\pkgs-0.6.0.1\\lib\\v0.6"); empty!(Base.LOAD_CACHE_PATH)'`
WARNING: @ngenerate is deprecated, used @generated function or (preferably) tuples/CartesianIndex instead
Stacktrace:
 [1] depwarn(::String, ::Symbol) at .\deprecated.jl:70

..... many deprecations ommited (not important now)

Running command:
`gcc -m64 -shared -o libhello.dll hello.o -std=gnu99 '-IC:\JuliaPro-0.6.0.1\Julia-0.6.0\include\julia' -DJULIA_ENABLE_THREADING=1 '-LC:\JuliaPro-0.6.0.1\Julia-0.6.0\bin' -Wl,--stack,8388608 -ljulia -lopenlibm '-Wl,-rpath,$ORIGIN' -Wl,--export-all-symbols`
hello.o: In function `julia_try_yieldto_247':
./event.jl:179: undefined reference to `__imp__resetstkoflw'
./event.jl:179:(.text+0x4d24): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp__resetstkoflw'
hello.o:./event.jl:189: undefined reference to `__imp__resetstkoflw'
hello.o:./event.jl:189:(.text+0x557e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp__resetstkoflw'
hello.o:./event.jl:189: undefined reference to `__imp__resetstkoflw'
hello.o:./event.jl:189:(.text+0x71fc): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp__resetstkoflw'
hello.o:./event.jl:189: undefined reference to `__imp__resetstkoflw'
hello.o:./event.jl:189:(.text+0x7264): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp__resetstkoflw'
hello.o:./event.jl:189: undefined reference to `__imp__resetstkoflw'
hello.o:./event.jl:189:(.text+0xc4cd): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp__resetstkoflw'
hello.o:./event.jl:189: more undefined references to `__imp__resetstkoflw' follow
hello.o:./event.jl:189:(.text+0xf735): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp__resetstkoflw'
hello.o:./event.jl:189:(.text+0xf9ac): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp__resetstkoflw'
hello.o:./event.jl:189:(.text+0x10765): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp__resetstkoflw'
hello.o:./event.jl:189:(.text+0x108d9): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp__resetstkoflw'
hello.o:./event.jl:189:(.text+0x122da): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp__resetstkoflw'
hello.o:./event.jl:189:(.text+0x12536): additional relocation overflows omitted from the output
collect2: error: ld returned 1 exit status
ERROR: LoadError: failed process: Process(`gcc -m64 -shared -o libhello.dll hello.o -std=gnu99 '-IC:\JuliaPro-0.6.0.1\Julia-0.6.0\include\julia' -DJULIA_ENABLE_THREADING=1 '-LC:\JuliaPro-0.6.0.1\Julia-0.6.0\bin' -Wl,--stack,8388608 -ljulia -lopenlibm '-Wl,-rpath,$ORIGIN' -Wl,--export-all-symbols`, ProcessExited(1)) [1]
Stacktrace:
 [1] pipeline_error(::Base.Process) at .\process.jl:682
 [2] run(::Cmd) at .\process.jl:651
 [3] julia_compile(::String) at C:\Users\phlavenk\Documents\Python_Scripts\static-julia-master\juliac.jl:49
 [4] main() at C:\Users\phlavenk\Documents\Python_Scripts\static-julia-master\juliac.jl:64
 [5] include_from_node1(::String) at .\loading.jl:569
 [6] include(::String) at .\sysimg.jl:14
 [7] process_options(::Base.JLOptions) at .\client.jl:305
 [8] _start() at .\client.jl:371
while loading C:\Users\phlavenk\Documents\Python_Scripts\static-julia-master\juliac.jl, in expression starting on line 67

The hello.o file is created in the builddir (~47.5 MB), but then the linking stage is unsuccessful.

Could you please help me to figure out what's the root cause of the error? I see that there are people that managed to compile the example on windows. Am I missing any library dependence? Thank for your ideas.

Petr

Readme example fails when renaming hello.jl to hi.jl

When I rename hello.jl to hl.jl and run julia juliac.jl -ve hi.jl it fails. The resulting binary tried to look for libhello.so. I came across this when compiling my own code failed (same error message), but when I renamed it to hello.jl, it worked.

This was on Ubuntu 16.04 (4.10.0-38-generic #42~16.04.1-Ubuntu SMP x86_64) and Julia 0.6.1. The following is the error message I got.

vvjn@rocket:~/static-julia-master$ mv hello.jl hi.jl
vvjn@rocket:~/static-julia-master$ julia juliac.jl -ve hi.jl
Julia program file:
"/home/vvjn/static-julia-master/hi.jl"
C program file:
"/home/vvjn/static-julia-master/program.c"
Build directory:
"/home/vvjn/static-julia-master/builddir"
Change to build directory
Build object file "hi.o":
`/home/vvjn/opt/julia/bin/julia -Cx86-64 -J/home/vvjn/opt/julia/lib/julia/sys.so --compile=yes --depwarn=yes --startup-file=no --output-o hi.o -e 'include("/home/vvjn/static-julia-master/hi.jl"); push!(Base.LOAD_CACHE_PATH, "/home/vvjn/.julia/lib/v0.6"); empty!(Base.LOAD_CACHE_PATH)'`

Build shared library "libhi.so":
`gcc -m64 -shared -o libhi.so hi.o -std=gnu99 -I/home/vvjn/opt/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC -L/home/vvjn/opt/julia/lib -Wl,--export-dynamic -Wl,-rpath,/home/vvjn/opt/julia/lib -Wl,-rpath,/home/vvjn/opt/julia/lib/julia -ljulia`
Build executable file "hi":
`gcc -m64 -o hi /home/vvjn/static-julia-master/program.c libhi.so -std=gnu99 -I/home/vvjn/opt/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC -L/home/vvjn/opt/julia/lib -Wl,--export-dynamic -Wl,-rpath,/home/vvjn/opt/julia/lib -Wl,-rpath,/home/vvjn/opt/julia/lib/julia -ljulia '-Wl,-rpath,$ORIGIN'`
Delete object file "hi.o"
vvjn@rocket:~/static-julia-master$
vvjn@rocket:~/static-julia-master$ cd builddir/
vvjn@rocket:~/static-julia-master/builddir$ ls
hi  libhi.so
vvjn@rocket:~/static-julia-master/builddir$ ./hi
ERROR: could not load library "/home/vvjn/static-julia-master/builddir/libhello"
/home/vvjn/static-julia-master/builddir/libhello.so: cannot open shared object file: No such file or directory

Warning compiling program.c with ARGS

I copied from program2.c the follwing step:

  jl_value_t *type = jl_apply_array_type(jl_string_type, 1);
  jl_array_t *ARGS = jl_alloc_array_1d(type, 0);
  JL_GC_PUSH1(&ARGS);
  jl_array_grow_end(ARGS, argc - 1);
  for (i = 1; i < argc; i++) {
      jl_value_t *s = (jl_value_t*)jl_cstr_to_string(argv[i]);
      jl_arrayset(ARGS, s, i - 1);
  }

I keep getting this warning:

D:\myprog\compile2\program.c: In function 'main':
D:\myprog\compile2\program.c:68:42: warning: passing argument 1 of 'jl_apply_array_type' from incompatible pointer type [-Wincompatible-pointer-types]
   jl_value_t *type = jl_apply_array_type(jl_string_type, 1);
                                          ^~~~~~~~~~~~~~
In file included from D:\myprog\compile2\program.c:17:0:
D:\myprog\deps\julia\julia-0.6.0-win64\include\julia/julia.h:1199:26: note: expected 'jl_value_t * {aka struct _jl_value_t *}' but argument is of type 'jl_datatype_t * {aka struct _jl_datatype_t *}'
 JL_DLLEXPORT jl_value_t *jl_apply_array_type(jl_value_t *type, size_t dim);
                          ^~~~~~~~~~~~~~~~~~~

everything seems to work though.

I am using x86_64-w64-mingw32-gcc from MSYS2 in windows 10 64bits.
With julia-0.6.0 64bits and the current master of this script.

How to detect static build?

What is the best (standard?) way to detect a static-julia build ?
Perhaps there should be Base.is_static_julia() -> Bool ?

I currently have the following at the bottom of my main module to check for the outputo option:

if Base.JLOptions().outputo != Ptr{UInt8}(0)

    Base.@ccallable function julia_main(args::Vector{String})::Cint
        init(args)
        return 0
    end

else
    init(ARGS)
end

end # mymodule

Library not loaded: @rpath/"libtiny.dylib" -- image not found

It looks like the most recent change to support julia v0.7 has broken my system running v0.6.2.

The executable complains for some reason that it cannot find "libhello.dylib", despite it being right there next to it...

 23:03:52 | ~/src/static-julia (master) $ julia juliac.jl -vae hello.jl
Julia program file:
  "/Users/daly/src/static-julia/hello.jl"
C program file:
  "/Users/daly/src/static-julia/program.c"
Build directory:
  "/Users/daly/src/static-julia/builddir"
Change to build directory
Build module image files ".ji" in subdirectory "tmp_v0.6.2":
  `/Applications/Julia-0.6.app/Contents/Resources/julia/bin/julia -Ccore2 -J/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia/sys.dylib --compile=yes --depwarn=yes --startup-file=no -e '
  empty!(Base.LOAD_CACHE_PATH) # reset / remove any builtin paths
  push!(Base.LOAD_CACHE_PATH, abspath("tmp_v0.6.2")) # enable usage of precompiled files
  include("/Users/daly/src/static-julia/hello.jl") # include "julia_program" file
  empty!(Base.LOAD_CACHE_PATH) # reset / remove build-system-relative paths'`
WARNING: Method definition midpoints(Base.Range{T} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:535.
WARNING: Method definition midpoints(AbstractArray{T, 1} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:533.
Build object file "hello.o" in subdirectory "tmp_v0.6.2":
  `/Applications/Julia-0.6.app/Contents/Resources/julia/bin/julia -Ccore2 -J/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia/sys.dylib --compile=yes --depwarn=yes --startup-file=no --output-o tmp_v0.6.2/hello.o -e '
  empty!(Base.LOAD_CACHE_PATH) # reset / remove any builtin paths
  push!(Base.LOAD_CACHE_PATH, abspath("tmp_v0.6.2")) # enable usage of precompiled files
  include("/Users/daly/src/static-julia/hello.jl") # include "julia_program" file
  empty!(Base.LOAD_CACHE_PATH) # reset / remove build-system-relative paths'`
WARNING: Method definition midpoints(Base.Range{T} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:535.
WARNING: Method definition midpoints(AbstractArray{T, 1} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:533.
Build shared library "libhello.dylib" in build directory:
  `gcc -m64 -shared -o libhello.dylib tmp_v0.6.2/hello.o -std=gnu99 -I/Applications/Julia-0.6.app/Contents/Resources/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC -L/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia -ljulia '-Wl,-install_name,@rpath/"libhello.dylib"'`
Build executable file "hello" in build directory:
  `gcc -m64 '-DJULIAC_PROGRAM_LIBNAME="libhello"' -o hello /Users/daly/src/static-julia/program.c libhello.dylib -std=gnu99 -I/Applications/Julia-0.6.app/Contents/Resources/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC -L/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia -ljulia -Wl,-rpath,@executable_path`

 23:05:59 | ~/src/static-julia (master) $ ./builddir/hello
dyld: Library not loaded: @rpath/"libhello.dylib"
  Referenced from: /Users/daly/src/static-julia/./builddir/hello
  Reason: image not found
[4]    55109 abort      ./builddir/hello
 23:06:00 | ~/src/static-julia (master) $

Here it is working before the latest change:

 23:06:26 | ~/src/static-julia (c1f7b20) $ git checkout HEAD~
 23:06:26 | ~/src/static-julia (c1f7b20) $ julia juliac.jl -vae hello.jl
Julia program file:
  "/Users/daly/src/static-julia/hello.jl"
C program file:
  "/Users/daly/src/static-julia/program.c"
Build directory:
  "/Users/daly/src/static-julia/builddir"
Change to build directory
Build ".ji" files:
  `/Applications/Julia-0.6.app/Contents/Resources/julia/bin/julia -Ccore2 -J/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia/sys.dylib --compile=yes --depwarn=yes --startup-file=no -e '
  VERSION >= v"0.7+" && Base.init_load_path("/Applications/Julia-0.6.app/Contents/Resources/julia/bin") # initialize location of site-packages
  empty!(Base.LOAD_CACHE_PATH) # reset / remove any builtin paths
  push!(Base.LOAD_CACHE_PATH, abspath("tmp_v0.6.2")) # enable usage of precompiled files
  include("/Users/daly/src/static-julia/hello.jl") # include "julia_program" file
  empty!(Base.LOAD_CACHE_PATH) # reset / remove build-system-relative paths'`
WARNING: Method definition midpoints(AbstractArray{T, 1} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:533.
WARNING: Method definition midpoints(Base.Range{T} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:535.
WARNING: Method definition midpoints(Base.Range{T} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:535.
WARNING: Method definition midpoints(AbstractArray{T, 1} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:533.
WARNING: Method definition midpoints(Base.Range{T} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:535.
WARNING: Method definition midpoints(AbstractArray{T, 1} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:533.
WARNING: Method definition midpoints(Base.Range{T} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:535.
WARNING: Method definition midpoints(AbstractArray{T, 1} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:533.
Build object file "hello.o":
  `/Applications/Julia-0.6.app/Contents/Resources/julia/bin/julia -Ccore2 -J/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia/sys.dylib --compile=yes --depwarn=yes --startup-file=no --output-o tmp_v0.6.2/hello.o -e '
  VERSION >= v"0.7+" && Base.init_load_path("/Applications/Julia-0.6.app/Contents/Resources/julia/bin") # initialize location of site-packages
  empty!(Base.LOAD_CACHE_PATH) # reset / remove any builtin paths
  push!(Base.LOAD_CACHE_PATH, abspath("tmp_v0.6.2")) # enable usage of precompiled files
  include("/Users/daly/src/static-julia/hello.jl") # include "julia_program" file
  empty!(Base.LOAD_CACHE_PATH) # reset / remove build-system-relative paths'`
WARNING: Method definition midpoints(Base.Range{T} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:535.
WARNING: Method definition midpoints(AbstractArray{T, 1} where T) in module Base at deprecated.jl:56 overwritten in module StatsBase at /Users/daly/.julia/v0.6/StatsBase/src/hist.jl:533.
Build shared library "libhello.dylib":
  `gcc -m64 -shared -o libhello.dylib tmp_v0.6.2/hello.o -std=gnu99 -I/Applications/Julia-0.6.app/Contents/Resources/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC -L/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia -ljulia -Wl,-install_name,@rpath/libhello.dylib`
Build executable file "hello":
  `gcc -m64 -o hello /Users/daly/src/static-julia/program.c libhello.dylib -std=gnu99 -I/Applications/Julia-0.6.app/Contents/Resources/julia/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC '-DJULIAC_PROGRAM_LIBNAME="libhello"' -L/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib -Wl,-rpath,/Applications/Julia-0.6.app/Contents/Resources/julia/lib/julia -ljulia -Wl,-rpath,@executable_path`

 23:08:00 | ~/src/static-julia (c1f7b20) $ ./builddir/hello
hello, world
f() = -1.522602195629931
       ┌────────────────────────────────────────┐
   100 │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠎│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⠁⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠊⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠔⠁⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠔⠁⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠊⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠤⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠔⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠤⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠤⠒⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⠔⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       │⠀⠀⠀⠀⠀⠀⢀⣀⠤⠔⠊⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
     0 │⣀⠤⠤⠔⠒⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀│
       └────────────────────────────────────────┘
       1                                       10
 23:08:00 | ~/src/static-julia (c1f7b20) $

I'm on macOS 10.13.3 (17D47), fwiw.

I'm going to try to look now to see if I can find anything that could be responsible...

Set JULIA_HOME?

In a statically compiled program Base.julia_cmd() seems to use the directory of the static executable as the path to the julia executable.

To work around this I've added -DJULIA_HOME=$JULIA_HOME to the gcc command line in juliac.jl. and setenv("JULIA_HOME", TOSTRING(JULIA_HOME), 0); in the main() function in program.c.

This causes the statically compiled program to have the same JULIA_HOME as the compile-time julia.

Generating the single binary.

In the readme it says that with julia 0.7 a single binary file can be generated. But doing julia juliac.jl -ve currently produces an executable and a dylib (I'm on mac). To generate the single binary, do I have to go into juliac.jl and change the mentions of program.c to program2.c, or is more required?

Compiled hello.jl hangs

Hi- I'm fairly new to Julia but have been having an issue with compiling static julia.
my hello.jl:

module Hello
Base.@ccallable function julia_main(ARGS::Vector{String})::Cint
    n = parse(Int, readline(STDIN))
    i :: UInt64 = 0
    while i < n
        i = i + 1
        println(i)
    end
    return 0;
end
end

which prints the numbers from 1 to n as expected when called from Julia. However, when compiling this and running it, it will hang at some large number (the number it hangs at is the same every time it is run after being compiled, but changes when recompiled).

I don't think it is an IO issue, since another program which did more work in the loop, but did not print anything was also hanging.

This was compiled with Julia version 0.6.1

Segfault when gc runs?

This might be a stupid question as I don't really understand what's going on under the hood, but it seems like the generated binary will segfault as soon as the gc starts. Is there a way to avoid this?

Here's an example hello.jl:

module Hello

Base.@ccallable function julia_main(ARGS::Vector{String})::Cint
    for i = 1:1000000
        x = rand(1000000)
        println(sum(x))
    end
    return 0
end

end

Gives me:

$ ./hello
499840.0980463533
499834.3183758338
500019.1602265821
499675.78978630295
499743.0457202371

signal (11): Segmentation fault: 11
while loading no file, in expression starting on line 0
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_mark_stack at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_mark_task at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_mark_module at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_mark_module at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_mark_module at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_mark_module at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_mark_module at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_scan_obj_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
gc_push_root at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
_jl_gc_collect at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jl_gc_collect at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jl_gc_pool_alloc at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jl_gc_alloc at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
_new_array_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jl_alloc_array_1d at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
julia_main at /Users/jack/Dropbox (MIT)/research/static-julia/builddir/libhello.dylib (unknown line)
julia_main at /Users/jack/Dropbox (MIT)/research/static-julia/builddir/libhello.dylib (unknown line)
main at /Users/jack/Dropbox (MIT)/research/static-julia/builddir/./hello (unknown line)
Allocations: 847477 (Pool: 846373; Big: 1104); GC: 0
[1]    67640 segmentation fault  ./hello

Building so versions of packages?

This looks helpful, I've long meant to play with AOT compilation but have never gotten around to figuring out what it can do.

Question: is it feasible to use this to create a shared lib that eliminates precompilation overhead? E.g., an Images.so file that contains a precompiled (to machine code) library? But one that can be used in interactive (REPL) sessions?

trailing "/" in the install path causes error.

this compiles successfully:
julia juliac.jl hello.jl /usr/local/julia ~/.julia

but this fails:
julia juliac.jl hello.jl /usr/local/julia/ ~/.julia

ERROR: LoadError: failed process: Process(/usr/local/julia/bin/julia -Cx86-64 -J/usr/local/julia/lib/julia/sys.so --compile=yes --depwarn=yes -J/usr/local/julia/lib/julia/sys.so --startup-file=no --output-o hello.o -e ' vers = "v0.6" const DIR_NAME = ".julia" push!(Base.LOAD_CACHE_PATH, abspath("/root/.julia", "lib", vers)) include("hello.jl") empty!(Base.LOAD_CACHE_PATH) ', ProcessSignaled(9)) [0]
Stacktrace:
[1] pipeline_error(::Base.Process) at ./process.jl:682
[2] run(::Cmd) at ./process.jl:651
[3] compile(::String, ::String, ::String) at /root/static-julia/juliac.jl:18
[4] include_from_node1(::String) at ./loading.jl:569
[5] include(::String) at ./sysimg.jl:14
[6] process_options(::Base.JLOptions) at ./client.jl:305
[7] _start() at ./client.jl:371
while loading /root/static-julia/juliac.jl, in expression starting on line 51

Portability: LLVM error when running in different architecture

I have successfully compiled all my programs and used them in my computer (windows 10). But I am having portability issues.

When I compile on my "windows 10 64bits core i7-5500U" it works on all other i7 I could test on. However, when I use that on an amazon "Windows Server2012-R2 with Intel Xeon E5-2670 v2" I get the following error:

LLVM ERROR: Program used external function 'rint' which could not be resolved!

rint seems to be from openlibm.

Probably related to dhoegh/BuildExecutable.jl#47
and
https://discourse.julialang.org/t/cpu-target-of-standard-windows-64-bit-download/2885/5

error LoadError: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved

julia> versioninfo()
Julia Version 1.1.0
Commit 80516ca202 (2019-01-21 21:24 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Core(TM) i7-4700HQ CPU @ 2.40GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-6.0.1 (ORCJIT, haswell)

..\bin\julia.exe juliac.jl -vae hello.jl


Dict{String,Any}("builddir"=>"builddir","juliaprog"=>"hello.jl","optimize"=>nothing,"depwarn"=>nothing,"compile"=>nothing,"check-bounds"=>nothing,"inline"=>nothing,"quiet"=>false,"clean"=>false,"debug"=>nothing,"cprog"=>nothing,"autodeps"=>true,"sysimage"=>nothing,"verbose"=>true,"object"=>false,"executable"=>true,"shared"=>false,"cpu-target"=>nothing,"julialibs"=>false,"math-mode"=>nothing)

ERROR: LoadError: ArgumentError: broadcasting over dictionaries and NamedTuples is reserved
Stacktrace:
[1] broadcastable(::Dict{String,Any}) at .\broadcast.jl:615
[2] broadcasted(::Function, ::Dict{String,Any}, ::Array{String,1}) at .\broadcast.jl:1164
[3] main(::Array{String,1}) at F:\Julia-1.1.0\static-julia\juliac.jl:123
[4] top-level scope at none:0
[5] include at .\boot.jl:326 [inlined]
[6] include_relative(::Module, ::String) at .\loading.jl:1038
[7] include(::Module, ::String) at .\sysimg.jl:29
[8] exec_options(::Base.JLOptions) at .\client.jl:267
[9] _start() at .\client.jl:436
in expression starting at F:\Julia-1.1.0\static-julia\juliac.jl:350

how can I custom the “image_file“

the build is successed, but when I run my program, I got the error ERROR: could not load library "mypath/builddir/libhello"

I found that the image_file is hard coded in program.c in line 21:

jl_options.image_file = "libhello";

so, how can I custom it?

juliac.jl currently needs to be run from static-julia directory

Otherwise you get something like

twan@tk-loco:~/code/RigidBodyDynamics/v0.6/RigidBodyDynamics$ julia ~/code/static-julia/juliac.jl hello.jl /opt/julia-0.6/ $JULIA_PKGDIR 
Program File : hello.jl
Julia Install Path: /opt/julia-0.6/
gcc: error: program.c: No such file or directory
ERROR: LoadError: failed process: Process(`gcc -m64 program.c -o hello libhello.so -std=gnu99 -I/opt/julia-0.6/include/julia -DJULIA_ENABLE_THREADING=1 -fPIC -L/opt/julia-0.6/lib -Wl,--export-dynamic -Wl,-rpath,/opt/julia-0.6/lib -Wl,-rpath,/opt/julia-0.6/lib/julia -ljulia -lm '-Wl,-rpath,$ORIGIN'`, ProcessExited(1)) [1]
Stacktrace:
 [1] pipeline_error(::Base.Process) at ./process.jl:682
 [2] run(::Cmd) at ./process.jl:651
 [3] compile(::String, ::String, ::String) at /home/twan/code/static-julia/juliac.jl:35
 [4] include_from_node1(::String) at ./loading.jl:569
 [5] include(::String) at ./sysimg.jl:14
 [6] process_options(::Base.JLOptions) at ./client.jl:305
 [7] _start() at ./client.jl:371
while loading /home/twan/code/static-julia/juliac.jl, in expression starting on line 51

(the library is generated just fine)

Handle package binary dependencies

Is there currently a way to deal with shared libraries referenced by other packages used in compiled code? I'm trying to create a standalone binary for a tool that should run on our HPC. The code I'm trying to compile relies on the HDF5 package, which uses the Blosc package, which relies on the libblosc.dylib located under the deps folder of that package. Now, when I run my binary on a system that does not have the same julia package tree as on the compile machine, it returns an error saying it is unable to find the library.

fatal: error thrown and no exception handler available.
Base.InitError(mod=:Blosc, error=ErrorException("could not load library "/Volumes/DataX/Users/grogee/.julia/v0.6/Blosc/src/../deps/libblosc"
dlopen(/Volumes/DataX/Users/grogee/.julia/v0.6/Blosc/src/../deps/libblosc.dylib, 1): image not found"))
rec_backtrace at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jl_throw at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jl_errorf at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jl_dlerror at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jl_load_dynamic_library_ at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jl_get_library at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jl_load_and_lookup at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
jlplt_blosc_init_25622 at /opt/data2/Software/HMMSpikeSorting/hmm_decode_julia/libhmmsort.dylib (unknown line)
__init__ at /opt/data2/Software/HMMSpikeSorting/hmm_decode_julia/libhmmsort.dylib (unknown line)
jlcall___init___25620 at /opt/data2/Software/HMMSpikeSorting/hmm_decode_julia/libhmmsort.dylib (unknown line)
jl_module_run_initializer at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
_julia_init at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
julia_init at /Applications/Julia-0.6.app/Contents/Resources/julia/lib/libjulia.dylib (unknown line)
main at /opt/data2/Software/HMMSpikeSorting/hmm_decode_julia/hmmsort (unknown line)

ARGS doesn't work

The following program

module Hello

Base.@ccallable function julia_main(ARGS::Vector{String})::Cint
    println(length(ARGS))
    return 0
end

end

always prints 0, whether I run ./hello or ./hello 1 2 3, etc.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.