Rendre ocamlc -output-obj compatible avec Dynlink et le toplevel

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@6130 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Xavier Leroy 2004-02-22 15:07:51 +00:00
parent 96b512c1da
commit e2b313a055
19 changed files with 176 additions and 69 deletions

54
.depend
View File

@ -139,9 +139,11 @@ typing/includemod.cmx: typing/ctype.cmx typing/env.cmx typing/ident.cmx \
typing/mtype.cmx typing/path.cmx typing/printtyp.cmx typing/subst.cmx \
utils/tbl.cmx typing/typedtree.cmx typing/types.cmx typing/includemod.cmi
typing/mtype.cmo: typing/btype.cmi typing/ctype.cmi typing/env.cmi \
typing/ident.cmi typing/path.cmi typing/types.cmi typing/mtype.cmi
typing/ident.cmi typing/path.cmi typing/subst.cmi typing/types.cmi \
typing/mtype.cmi
typing/mtype.cmx: typing/btype.cmx typing/ctype.cmx typing/env.cmx \
typing/ident.cmx typing/path.cmx typing/types.cmx typing/mtype.cmi
typing/ident.cmx typing/path.cmx typing/subst.cmx typing/types.cmx \
typing/mtype.cmi
typing/oprint.cmo: parsing/asttypes.cmi typing/outcometree.cmi \
typing/oprint.cmi
typing/oprint.cmx: parsing/asttypes.cmi typing/outcometree.cmi \
@ -430,8 +432,8 @@ asmcomp/asmlink.cmi: asmcomp/compilenv.cmi
asmcomp/clambda.cmi: parsing/asttypes.cmi typing/ident.cmi \
bytecomp/lambda.cmi
asmcomp/closure.cmi: asmcomp/clambda.cmi bytecomp/lambda.cmi
asmcomp/cmm.cmi: typing/ident.cmi
asmcomp/cmmgen.cmi: asmcomp/clambda.cmi asmcomp/cmm.cmi
asmcomp/cmm.cmi: typing/ident.cmi
asmcomp/codegen.cmi: asmcomp/cmm.cmi
asmcomp/comballoc.cmi: asmcomp/mach.cmi
asmcomp/compilenv.cmi: asmcomp/clambda.cmi typing/ident.cmi
@ -445,8 +447,8 @@ asmcomp/printlinear.cmi: asmcomp/linearize.cmi
asmcomp/printmach.cmi: asmcomp/mach.cmi asmcomp/reg.cmi
asmcomp/proc.cmi: asmcomp/mach.cmi asmcomp/reg.cmi
asmcomp/reg.cmi: asmcomp/cmm.cmi
asmcomp/reload.cmi: asmcomp/mach.cmi
asmcomp/reloadgen.cmi: asmcomp/mach.cmi asmcomp/reg.cmi
asmcomp/reload.cmi: asmcomp/mach.cmi
asmcomp/schedgen.cmi: asmcomp/linearize.cmi asmcomp/mach.cmi
asmcomp/scheduling.cmi: asmcomp/linearize.cmi
asmcomp/selectgen.cmi: asmcomp/arch.cmo asmcomp/cmm.cmi typing/ident.cmi \
@ -454,8 +456,8 @@ asmcomp/selectgen.cmi: asmcomp/arch.cmo asmcomp/cmm.cmi typing/ident.cmi \
asmcomp/selection.cmi: asmcomp/cmm.cmi asmcomp/mach.cmi
asmcomp/spill.cmi: asmcomp/mach.cmi
asmcomp/split.cmi: asmcomp/mach.cmi
asmcomp/arch.cmo: utils/config.cmi utils/misc.cmi
asmcomp/arch.cmx: utils/config.cmx utils/misc.cmx
asmcomp/arch.cmo: utils/misc.cmi
asmcomp/arch.cmx: utils/misc.cmx
asmcomp/asmgen.cmo: utils/clflags.cmo asmcomp/closure.cmi asmcomp/cmm.cmi \
asmcomp/cmmgen.cmi asmcomp/coloring.cmi asmcomp/comballoc.cmi \
utils/config.cmi asmcomp/emit.cmi asmcomp/emitaux.cmi asmcomp/interf.cmi \
@ -510,8 +512,6 @@ asmcomp/closure.cmx: parsing/asttypes.cmi asmcomp/clambda.cmx \
utils/clflags.cmx asmcomp/compilenv.cmx typing/ident.cmx \
bytecomp/lambda.cmx utils/misc.cmx typing/primitive.cmx \
bytecomp/switch.cmx utils/tbl.cmx asmcomp/closure.cmi
asmcomp/cmm.cmo: asmcomp/arch.cmo typing/ident.cmi asmcomp/cmm.cmi
asmcomp/cmm.cmx: asmcomp/arch.cmx typing/ident.cmx asmcomp/cmm.cmi
asmcomp/cmmgen.cmo: asmcomp/arch.cmo parsing/asttypes.cmi asmcomp/clambda.cmi \
utils/clflags.cmo asmcomp/cmm.cmi asmcomp/compilenv.cmi utils/config.cmi \
typing/ident.cmi bytecomp/lambda.cmi utils/misc.cmi typing/primitive.cmi \
@ -520,6 +520,8 @@ asmcomp/cmmgen.cmx: asmcomp/arch.cmx parsing/asttypes.cmi asmcomp/clambda.cmx \
utils/clflags.cmx asmcomp/cmm.cmx asmcomp/compilenv.cmx utils/config.cmx \
typing/ident.cmx bytecomp/lambda.cmx utils/misc.cmx typing/primitive.cmx \
asmcomp/proc.cmx bytecomp/switch.cmx typing/types.cmx asmcomp/cmmgen.cmi
asmcomp/cmm.cmo: asmcomp/arch.cmo typing/ident.cmi asmcomp/cmm.cmi
asmcomp/cmm.cmx: asmcomp/arch.cmx typing/ident.cmx asmcomp/cmm.cmi
asmcomp/codegen.cmo: asmcomp/cmm.cmi asmcomp/coloring.cmi asmcomp/emit.cmi \
asmcomp/interf.cmi asmcomp/linearize.cmi asmcomp/liveness.cmi \
asmcomp/printcmm.cmi asmcomp/printlinear.cmi asmcomp/printmach.cmi \
@ -540,16 +542,16 @@ asmcomp/compilenv.cmo: asmcomp/clambda.cmi utils/config.cmi typing/env.cmi \
typing/ident.cmi utils/misc.cmi asmcomp/compilenv.cmi
asmcomp/compilenv.cmx: asmcomp/clambda.cmx utils/config.cmx typing/env.cmx \
typing/ident.cmx utils/misc.cmx asmcomp/compilenv.cmi
asmcomp/emit.cmo: asmcomp/arch.cmo asmcomp/cmm.cmi asmcomp/compilenv.cmi \
utils/config.cmi asmcomp/emitaux.cmi asmcomp/linearize.cmi \
parsing/location.cmi asmcomp/mach.cmi utils/misc.cmi asmcomp/proc.cmi \
asmcomp/reg.cmi asmcomp/emit.cmi
asmcomp/emit.cmx: asmcomp/arch.cmx asmcomp/cmm.cmx asmcomp/compilenv.cmx \
utils/config.cmx asmcomp/emitaux.cmx asmcomp/linearize.cmx \
parsing/location.cmx asmcomp/mach.cmx utils/misc.cmx asmcomp/proc.cmx \
asmcomp/reg.cmx asmcomp/emit.cmi
asmcomp/emitaux.cmo: asmcomp/emitaux.cmi
asmcomp/emitaux.cmx: asmcomp/emitaux.cmi
asmcomp/emit.cmo: asmcomp/arch.cmo utils/clflags.cmo asmcomp/cmm.cmi \
asmcomp/compilenv.cmi utils/config.cmi asmcomp/emitaux.cmi \
asmcomp/linearize.cmi parsing/location.cmi asmcomp/mach.cmi \
utils/misc.cmi asmcomp/proc.cmi asmcomp/reg.cmi asmcomp/emit.cmi
asmcomp/emit.cmx: asmcomp/arch.cmx utils/clflags.cmx asmcomp/cmm.cmx \
asmcomp/compilenv.cmx utils/config.cmx asmcomp/emitaux.cmx \
asmcomp/linearize.cmx parsing/location.cmx asmcomp/mach.cmx \
utils/misc.cmx asmcomp/proc.cmx asmcomp/reg.cmx asmcomp/emit.cmi
asmcomp/interf.cmo: asmcomp/mach.cmi utils/misc.cmi asmcomp/proc.cmi \
asmcomp/reg.cmi asmcomp/interf.cmi
asmcomp/interf.cmx: asmcomp/mach.cmx utils/misc.cmx asmcomp/proc.cmx \
@ -586,20 +588,20 @@ asmcomp/proc.cmx: asmcomp/arch.cmx utils/ccomp.cmx utils/clflags.cmx \
asmcomp/reg.cmx asmcomp/proc.cmi
asmcomp/reg.cmo: asmcomp/cmm.cmi asmcomp/reg.cmi
asmcomp/reg.cmx: asmcomp/cmm.cmx asmcomp/reg.cmi
asmcomp/reload.cmo: asmcomp/reloadgen.cmi asmcomp/reload.cmi
asmcomp/reload.cmx: asmcomp/reloadgen.cmx asmcomp/reload.cmi
asmcomp/reloadgen.cmo: asmcomp/mach.cmi utils/misc.cmi asmcomp/reg.cmi \
asmcomp/reloadgen.cmi
asmcomp/reloadgen.cmx: asmcomp/mach.cmx utils/misc.cmx asmcomp/reg.cmx \
asmcomp/reloadgen.cmi
asmcomp/reload.cmo: asmcomp/arch.cmo asmcomp/cmm.cmi asmcomp/mach.cmi \
asmcomp/reg.cmi asmcomp/reloadgen.cmi asmcomp/reload.cmi
asmcomp/reload.cmx: asmcomp/arch.cmx asmcomp/cmm.cmx asmcomp/mach.cmx \
asmcomp/reg.cmx asmcomp/reloadgen.cmx asmcomp/reload.cmi
asmcomp/schedgen.cmo: asmcomp/arch.cmo asmcomp/cmm.cmi asmcomp/linearize.cmi \
asmcomp/mach.cmi utils/misc.cmi asmcomp/reg.cmi asmcomp/schedgen.cmi
asmcomp/schedgen.cmx: asmcomp/arch.cmx asmcomp/cmm.cmx asmcomp/linearize.cmx \
asmcomp/mach.cmx utils/misc.cmx asmcomp/reg.cmx asmcomp/schedgen.cmi
asmcomp/scheduling.cmo: asmcomp/arch.cmo asmcomp/mach.cmi \
asmcomp/schedgen.cmi asmcomp/scheduling.cmi
asmcomp/scheduling.cmx: asmcomp/arch.cmx asmcomp/mach.cmx \
asmcomp/schedgen.cmx asmcomp/scheduling.cmi
asmcomp/scheduling.cmo: asmcomp/schedgen.cmi asmcomp/scheduling.cmi
asmcomp/scheduling.cmx: asmcomp/schedgen.cmx asmcomp/scheduling.cmi
asmcomp/selectgen.cmo: asmcomp/arch.cmo asmcomp/cmm.cmi typing/ident.cmi \
asmcomp/mach.cmi utils/misc.cmi asmcomp/proc.cmi asmcomp/reg.cmi \
utils/tbl.cmi asmcomp/selectgen.cmi
@ -607,10 +609,10 @@ asmcomp/selectgen.cmx: asmcomp/arch.cmx asmcomp/cmm.cmx typing/ident.cmx \
asmcomp/mach.cmx utils/misc.cmx asmcomp/proc.cmx asmcomp/reg.cmx \
utils/tbl.cmx asmcomp/selectgen.cmi
asmcomp/selection.cmo: asmcomp/arch.cmo asmcomp/cmm.cmi asmcomp/mach.cmi \
utils/misc.cmi asmcomp/reg.cmi asmcomp/selectgen.cmi \
utils/misc.cmi asmcomp/proc.cmi asmcomp/reg.cmi asmcomp/selectgen.cmi \
asmcomp/selection.cmi
asmcomp/selection.cmx: asmcomp/arch.cmx asmcomp/cmm.cmx asmcomp/mach.cmx \
utils/misc.cmx asmcomp/reg.cmx asmcomp/selectgen.cmx \
utils/misc.cmx asmcomp/proc.cmx asmcomp/reg.cmx asmcomp/selectgen.cmx \
asmcomp/selection.cmi
asmcomp/spill.cmo: asmcomp/mach.cmi utils/misc.cmi asmcomp/proc.cmi \
asmcomp/reg.cmi asmcomp/spill.cmi
@ -650,6 +652,8 @@ driver/errors.cmx: bytecomp/bytelibrarian.cmx bytecomp/bytelink.cmx \
typing/typeclass.cmx typing/typecore.cmx typing/typedecl.cmx \
typing/typemod.cmx typing/typetexp.cmx utils/warnings.cmx \
driver/errors.cmi
driver/main_args.cmo: driver/main_args.cmi
driver/main_args.cmx: driver/main_args.cmi
driver/main.cmo: bytecomp/bytelibrarian.cmi bytecomp/bytelink.cmi \
bytecomp/bytepackager.cmi utils/clflags.cmo driver/compile.cmi \
utils/config.cmi driver/errors.cmi driver/main_args.cmi utils/misc.cmi \
@ -658,8 +662,6 @@ driver/main.cmx: bytecomp/bytelibrarian.cmx bytecomp/bytelink.cmx \
bytecomp/bytepackager.cmx utils/clflags.cmx driver/compile.cmx \
utils/config.cmx driver/errors.cmx driver/main_args.cmx utils/misc.cmx \
utils/warnings.cmx driver/main.cmi
driver/main_args.cmo: driver/main_args.cmi
driver/main_args.cmx: driver/main_args.cmi
driver/optcompile.cmo: asmcomp/asmgen.cmi utils/ccomp.cmi utils/clflags.cmo \
asmcomp/compilenv.cmi utils/config.cmi typing/env.cmi typing/ident.cmi \
utils/misc.cmi parsing/parse.cmi driver/pparse.cmi parsing/printast.cmi \

View File

@ -107,7 +107,7 @@ EXPUNGEOBJS=utils/misc.cmo utils/tbl.cmo \
utils/config.cmo utils/clflags.cmo \
typing/ident.cmo typing/path.cmo typing/types.cmo typing/btype.cmo \
typing/predef.cmo bytecomp/runtimedef.cmo bytecomp/bytesections.cmo \
bytecomp/dll.cmo bytecomp/symtable.cmo toplevel/expunge.cmo
bytecomp/dll.cmo bytecomp/meta.cmo bytecomp/symtable.cmo toplevel/expunge.cmo
PERVASIVES=$(STDLIB_MODULES) outcometree topdirs toploop

Binary file not shown.

Binary file not shown.

View File

@ -379,6 +379,13 @@ let link_bytecode_as_c tolink outfile =
let outchan = open_out outfile in
try
(* The bytecode *)
output_string outchan "#include <caml/mlvalues.h>\n";
output_string outchan "\
CAMLextern void caml_startup_code(
code_t code, asize_t code_size,
char *data, asize_t data_size,
char *section_table, asize_t section_table_size,
char **argv);\n";
output_string outchan "static int caml_code[] = {\n";
Symtable.init();
Consistbl.clear crc_interfaces;
@ -391,15 +398,26 @@ let link_bytecode_as_c tolink outfile =
output_string outchan "static char caml_data[] = {\n";
output_data_string outchan
(Marshal.to_string (Symtable.initial_global_table()) []);
Printf.fprintf outchan "\n};\n\n";
output_string outchan "\n};\n\n";
(* The sections *)
let sections =
[ "SYMB", Symtable.data_global_map();
"PRIM", Obj.repr(Symtable.data_primitive_names());
"CRCS", Obj.repr(extract_crc_interfaces()) ] in
output_string outchan "static char caml_sections[] = {\n";
output_data_string outchan
(Marshal.to_string sections []);
output_string outchan "\n};\n\n";
(* The table of primitives *)
Symtable.output_primitive_table outchan;
(* The entry point *)
output_string outchan "\n
void caml_startup(argv)
char ** argv;
void caml_startup(char ** argv)
{
caml_startup_code(caml_code, sizeof(caml_code), caml_data, argv);
caml_startup_code(caml_code, sizeof(caml_code),
caml_data, sizeof(caml_data),
caml_sections, sizeof(caml_sections),
argv);
}\n";
close_out outchan
with x ->

View File

@ -80,12 +80,18 @@ let seek_section ic name =
(* Return the contents of a section, as a string *)
let read_section ic name =
let read_section_string ic name =
let len = seek_section ic name in
let res = String.create len in
really_input ic res 0 len;
res
(* Return the contents of a section, as marshalled data *)
let read_section_struct ic name =
ignore (seek_section ic name);
input_value ic
(* Return the position of the beginning of the first section *)
let pos_first_section ic =

View File

@ -44,8 +44,11 @@ val seek_section: in_channel -> string -> int
and return the length of that section. Raise Not_found if no
such section exists. *)
val read_section: in_channel -> string -> string
val read_section_string: in_channel -> string -> string
(* Return the contents of a section, as a string *)
val read_section_struct: in_channel -> string -> 'a
(* Return the contents of a section, as marshalled data *)
val pos_first_section: in_channel -> int
(* Return the position of the beginning of the first section *)

View File

@ -21,3 +21,5 @@ type closure = unit -> Obj.t
external reify_bytecode : string -> int -> closure = "caml_reify_bytecode"
external invoke_traced_function : Obj.t -> Obj.t -> Obj.t -> Obj.t
= "caml_invoke_traced_function"
external get_section_table : unit -> (string * Obj.t) list
= "caml_get_section_table"

View File

@ -23,3 +23,5 @@ type closure = unit -> Obj.t
external reify_bytecode : string -> int -> closure = "caml_reify_bytecode"
external invoke_traced_function : Obj.t -> Obj.t -> Obj.t -> Obj.t
= "caml_invoke_traced_function"
external get_section_table : unit -> (string * Obj.t) list
= "caml_get_section_table"

View File

@ -99,11 +99,16 @@ let all_primitives () =
Tbl.iter (fun name number -> prim.(number) <- name) !c_prim_table.num_tbl;
prim
let output_primitive_names outchan =
let data_primitive_names () =
let prim = all_primitives() in
let b = Buffer.create 512 in
for i = 0 to Array.length prim - 1 do
output_string outchan prim.(i); output_char outchan '\000'
done
Buffer.add_string b prim.(i); Buffer.add_char b '\000'
done;
Buffer.contents b
let output_primitive_names outchan =
output_string outchan (data_primitive_names())
open Printf
@ -232,6 +237,9 @@ let initial_global_table () =
let output_global_map oc =
output_value oc !global_table
let data_global_map () =
Obj.repr !global_table
(* Functions for toplevel use *)
(* Update the in-core table of globals *)
@ -245,39 +253,59 @@ let update_global_table () =
!literal_table;
literal_table := []
(* Recover data for toplevel initialization. Data can come either from
executable file (normal case) or from linked-in data (-output-obj). *)
type section_reader = {
read_string: string -> string;
read_struct: string -> Obj.t;
close_reader: unit -> unit
}
let read_sections () =
try
let sections = Meta.get_section_table () in
{ read_string =
(fun name -> (Obj.magic(List.assoc name sections) : string));
read_struct =
(fun name -> List.assoc name sections);
close_reader =
(fun () -> ()) }
with Not_found ->
let ic = open_in_bin Sys.executable_name in
Bytesections.read_toc ic;
{ read_string = Bytesections.read_section_string ic;
read_struct = Bytesections.read_section_struct ic;
close_reader = fun () -> close_in ic }
(* Initialize the linker for toplevel use *)
let init_toplevel () =
(* Read back the known global symbols and the known primitives
from the executable file *)
let ic = open_in_bin Sys.executable_name in
begin try
Bytesections.read_toc ic;
ignore(Bytesections.seek_section ic "SYMB");
global_table := (input_value ic : Ident.t numtable);
let prims = Bytesections.read_section ic "PRIM" in
try
let sect = read_sections () in
(* Locations of globals *)
global_table := (Obj.magic (sect.read_struct "SYMB") : Ident.t numtable);
(* Primitives *)
let prims = sect.read_string "PRIM" in
c_prim_table := empty_numtable;
let pos = ref 0 in
while !pos < String.length prims do
let i = String.index_from prims !pos '\000' in
set_prim_table (String.sub prims !pos (i - !pos));
pos := i + 1
done
done;
(* DLL initialization *)
let dllpath = try sect.read_string "DLPT" with Not_found -> "" in
Dll.init_toplevel dllpath;
(* Recover CRC infos for interfaces *)
let crcintfs =
try (Obj.magic (sect.read_struct "CRCS") : (string * Digest.t) list)
with Not_found -> [] in
(* Done *)
sect.close_reader();
crcintfs
with Bytesections.Bad_magic_number | Not_found | Failure _ ->
fatal_error "Toplevel bytecode executable is corrupted"
end;
(* Initialize the Dll machinery for toplevel use *)
let dllpath =
try Bytesections.read_section ic "DLPT" with Not_found -> "" in
Dll.init_toplevel dllpath;
(* Recover CRC infos for interfaces *)
let crcintfs =
try
ignore(Bytesections.seek_section ic "CRCS");
(input_value ic : (string * Digest.t) list)
with Not_found -> [] in
close_in ic;
crcintfs
(* Find the value of a global identifier *)

View File

@ -25,6 +25,8 @@ val initial_global_table: unit -> Obj.t array
val output_global_map: out_channel -> unit
val output_primitive_names: out_channel -> unit
val output_primitive_table: out_channel -> unit
val data_global_map: unit -> Obj.t
val data_primitive_names: unit -> string
(* Functions for the toplevel *)

View File

@ -177,6 +177,17 @@ void caml_build_primitive_table(char * lib_path,
caml_ext_table_free(&caml_shared_libs_path, 0);
}
/* Build the table of primitives as a copy of the builtin primitive table.
Used for executables generated by ocamlc -output-obj. */
void caml_build_primitive_table_builtin(void)
{
int i;
caml_ext_table_init(&caml_prim_table, 0x180);
for (i = 0; caml_builtin_cprim[i] != 0; i++)
caml_ext_table_add(&caml_prim_table, (void *) caml_builtin_cprim[i]);
}
#endif /* NATIVE_CODE */
/** dlopen interface for the bytecode linker **/

View File

@ -31,4 +31,8 @@ extern void caml_build_primitive_table(char * lib_path,
/* The search path for shared libraries */
extern struct ext_table caml_shared_libs_path;
/* Build the table of primitives as a copy of the builtin primitive table.
Used for executables generated by ocamlc -output-obj. */
extern void caml_build_primitive_table_builtin(void);
#endif /* CAML_DYNLINK_H */

View File

@ -20,6 +20,7 @@
#include "fail.h"
#include "fix_code.h"
#include "interp.h"
#include "intext.h"
#include "major_gc.h"
#include "memory.h"
#include "minor_gc.h"
@ -35,6 +36,16 @@ CAMLprim value caml_get_global_data(value unit)
return caml_global_data;
}
char * caml_section_table = NULL;
asize_t caml_section_table_size;
CAMLprim value caml_get_section_table(value unit)
{
if (caml_section_table == NULL) caml_raise_not_found();
return caml_input_value_from_block(caml_section_table,
caml_section_table_size);
}
CAMLprim value caml_reify_bytecode(value prog, value len)
{
value clos;
@ -125,6 +136,12 @@ value caml_get_global_data(value unit)
return Val_unit; /* not reached */
}
value caml_get_section_table(value unit)
{
caml_invalid_argument("Meta.get_section_table");
return Val_unit; /* not reached */
}
value caml_realloc_global(value size)
{
caml_invalid_argument("Meta.realloc_global");

View File

@ -30,4 +30,7 @@ extern struct ext_table caml_prim_name_table;
#define Primitive(n) ((c_primitive)(caml_prim_table.contents[n]))
extern char * caml_section_table;
extern asize_t caml_section_table_size;
#endif /* CAML_PRIMS_H */

View File

@ -415,8 +415,11 @@ CAMLexport void caml_main(char **argv)
/* Main entry point when code is linked in as initialized data */
CAMLexport void caml_startup_code(code_t code, asize_t code_size,
char *data, char **argv)
CAMLexport void caml_startup_code(
code_t code, asize_t code_size,
char *data, asize_t data_size,
char *section_table, asize_t section_table_size,
char **argv)
{
value res;
@ -440,13 +443,15 @@ CAMLexport void caml_startup_code(code_t code, asize_t code_size,
caml_thread_code(caml_start_code, code_size);
#endif
/* Use the builtin table of primitives */
caml_prim_table.size = caml_prim_table.capacity = -1;
caml_prim_table.contents = (void **) caml_builtin_cprim;
caml_build_primitive_table_builtin();
/* Load the globals */
caml_global_data = caml_input_val_from_string((value)data, 0);
caml_global_data = caml_input_value_from_block(data, data_size);
/* Ensure that the globals are in the major heap. */
caml_oldify_one (caml_global_data, &caml_global_data);
caml_oldify_mopup ();
/* Record the sections (for caml_get_section_table in meta.c) */
caml_section_table = section_table;
caml_section_table_size = section_table_size;
/* Run the code */
caml_init_exceptions();
caml_sys_init("", argv);

View File

@ -16,12 +16,16 @@
#ifndef CAML_STARTUP_H
#define CAML_STARTUP_H
#include "misc.h"
#include "mlvalues.h"
#include "exec.h"
CAMLextern void caml_main(char **argv);
CAMLextern void caml_startup_code(code_t code, asize_t code_size,
char *data, char **argv);
CAMLextern void caml_startup_code(
code_t code, asize_t code_size,
char *data, asize_t data_size,
char *section_table, asize_t section_table_size,
char **argv);
enum { FILE_NOT_FOUND = -1, BAD_BYTECODE = -2 };

View File

@ -38,8 +38,8 @@ OTHEROBJS=\
../typing/datarepr.cmo ../typing/env.cmo ../typing/oprint.cmo \
../typing/ctype.cmo ../typing/printtyp.cmo ../typing/mtype.cmo \
../bytecomp/runtimedef.cmo ../bytecomp/bytesections.cmo \
../bytecomp/dll.cmo ../bytecomp/symtable.cmo \
../bytecomp/opcodes.cmo ../bytecomp/meta.cmo \
../bytecomp/dll.cmo ../bytecomp/meta.cmo ../bytecomp/symtable.cmo \
../bytecomp/opcodes.cmo \
../toplevel/genprintval.cmo \
../otherlibs/dynlink/dynlink.cmo

View File

@ -25,7 +25,7 @@ OBJS=dynlink.cmo
COMPILEROBJS=misc.cmo config.cmo tbl.cmo clflags.cmo consistbl.cmo \
ident.cmo path.cmo \
types.cmo btype.cmo predef.cmo runtimedef.cmo \
bytesections.cmo dll.cmo symtable.cmo opcodes.cmo meta.cmo
bytesections.cmo dll.cmo meta.cmo symtable.cmo opcodes.cmo
all: dynlink.cma extract_crc