diff --git a/src/kernel_services/abstract_interp/offsetmap.ml b/src/kernel_services/abstract_interp/offsetmap.ml
index 82625312c80d8735bfe1fd1c54330127ec4987a0..507f88fe4c81019cefb345cea00c9fa6405093b9 100644
--- a/src/kernel_services/abstract_interp/offsetmap.ml
+++ b/src/kernel_services/abstract_interp/offsetmap.ml
@@ -22,7 +22,6 @@
 
 open Abstract_interp
 
-let pervasives_succ = succ
 (* This module uses Bigints everywhere. Set up some notations *)
 let pretty_int = Int.pretty
 let ( =~ ) = Integer.equal
diff --git a/src/kernel_services/plugin_entry_points/plugin.ml b/src/kernel_services/plugin_entry_points/plugin.ml
index bd956deba6cd929e018b78d2348da570c48357dd..1ba3d14939cbf54d60a458a8055c5add286e537a 100644
--- a/src/kernel_services/plugin_entry_points/plugin.ml
+++ b/src/kernel_services/plugin_entry_points/plugin.ml
@@ -325,7 +325,7 @@ struct
 
     let mk_dir d =
       try
-        Unix.mkdir d 0o755;
+        Extlib.mkdir ~parents:true d 0o755;
         L.warning "creating %s directory `%s'" O.option_name d;
         d
       with Unix.Unix_error _ -> 
diff --git a/src/libraries/stdlib/extlib.ml b/src/libraries/stdlib/extlib.ml
index c24744c1154b1a4eb1ec89cd2197443026f7d6e6..df326129833953442984d3dac9344f93890f5990 100644
--- a/src/libraries/stdlib/extlib.ml
+++ b/src/libraries/stdlib/extlib.ml
@@ -343,6 +343,18 @@ let try_finally ~finally f x =
   hence interrupting the process, might not work: child processes still need to
   run some daemons, such as [flush_all] which is registered by default. *)
 
+let rec mkdir ?(parents=false) name perm =
+  try Unix.mkdir name perm
+  with
+  | Unix.Unix_error (Unix.ENOENT,_,_) when parents ->
+    let parent_name = Filename.dirname name in
+    if name <> parent_name then
+      begin
+        mkdir ~parents parent_name perm;
+        Unix.mkdir name perm
+      end
+  | e -> raise e
+
 let pid = Unix.getpid ()
 let safe_at_exit f =
   at_exit
diff --git a/src/libraries/stdlib/extlib.mli b/src/libraries/stdlib/extlib.mli
index 389a34fc00dbc551f3b374f637439aa4d90aa880..89d1cc38c082b61c94350adf14f074d4f611deba 100644
--- a/src/libraries/stdlib/extlib.mli
+++ b/src/libraries/stdlib/extlib.mli
@@ -331,6 +331,17 @@ val try_finally: finally:(unit -> unit) -> ('a -> 'b) -> 'a -> 'b
 (** System commands *)
 (* ************************************************************************* *)
 
+val mkdir : ?parents:bool -> string -> Unix.file_perm -> unit
+  (** [mkdir ?parents name perm] creates directory [name] with permission
+      [perm]. If [parents] is true, recursively create parent directories
+      if needed. [parents] defaults to false.
+      Note that this function may create some of the parent directories
+      and then fail to create the children, e.g. if [perm] does not allow
+      user execution of the created directory. This will leave the filesystem
+      in a modified state before raising an exception.
+      @raise [Unix.Unix_error] if cannot create [name] or its parents.
+      @since Frama-C+dev  *)
+
 val safe_at_exit : (unit -> unit) -> unit
   (** Register function to call with [Pervasives.at_exit], but only
       for non-child process (fork). The order of execution is preserved