return fd;
 }
 
-int mount_bpffs_for_pin(const char *name, bool is_dir)
+int create_and_mount_bpffs_dir(const char *dir_name)
 {
        char err_str[ERR_MAX_LEN];
-       char *file;
-       char *dir;
+       bool dir_exists;
        int err = 0;
 
-       if (is_dir && is_bpffs(name))
+       if (is_bpffs(dir_name))
                return err;
 
-       file = malloc(strlen(name) + 1);
-       if (!file) {
+       dir_exists = access(dir_name, F_OK) == 0;
+
+       if (!dir_exists) {
+               char *temp_name;
+               char *parent_name;
+
+               temp_name = strdup(dir_name);
+               if (!temp_name) {
+                       p_err("mem alloc failed");
+                       return -1;
+               }
+
+               parent_name = dirname(temp_name);
+
+               if (is_bpffs(parent_name)) {
+                       /* nothing to do if already mounted */
+                       free(temp_name);
+                       return err;
+               }
+
+               if (access(parent_name, F_OK) == -1) {
+                       p_err("can't create dir '%s' to pin BPF object: parent dir '%s' doesn't exist",
+                             dir_name, parent_name);
+                       free(temp_name);
+                       return -1;
+               }
+
+               free(temp_name);
+       }
+
+       if (block_mount) {
+               p_err("no BPF file system found, not mounting it due to --nomount option");
+               return -1;
+       }
+
+       if (!dir_exists) {
+               err = mkdir(dir_name, S_IRWXU);
+               if (err) {
+                       p_err("failed to create dir '%s': %s", dir_name, strerror(errno));
+                       return err;
+               }
+       }
+
+       err = mnt_fs(dir_name, "bpf", err_str, ERR_MAX_LEN);
+       if (err) {
+               err_str[ERR_MAX_LEN - 1] = '\0';
+               p_err("can't mount BPF file system on given dir '%s': %s",
+                     dir_name, err_str);
+
+               if (!dir_exists)
+                       rmdir(dir_name);
+       }
+
+       return err;
+}
+
+int mount_bpffs_for_file(const char *file_name)
+{
+       char err_str[ERR_MAX_LEN];
+       char *temp_name;
+       char *dir;
+       int err = 0;
+
+       if (access(file_name, F_OK) != -1) {
+               p_err("can't pin BPF object: path '%s' already exists", file_name);
+               return -1;
+       }
+
+       temp_name = strdup(file_name);
+       if (!temp_name) {
                p_err("mem alloc failed");
                return -1;
        }
 
-       strcpy(file, name);
-       dir = dirname(file);
+       dir = dirname(temp_name);
 
        if (is_bpffs(dir))
                /* nothing to do if already mounted */
                goto out_free;
 
+       if (access(dir, F_OK) == -1) {
+               p_err("can't pin BPF object: dir '%s' doesn't exist", dir);
+               err = -1;
+               goto out_free;
+       }
+
        if (block_mount) {
                p_err("no BPF file system found, not mounting it due to --nomount option");
                err = -1;
        err = mnt_fs(dir, "bpf", err_str, ERR_MAX_LEN);
        if (err) {
                err_str[ERR_MAX_LEN - 1] = '\0';
-               p_err("can't mount BPF file system to pin the object (%s): %s",
-                     name, err_str);
+               p_err("can't mount BPF file system to pin the object '%s': %s",
+                     file_name, err_str);
        }
 
 out_free:
-       free(file);
+       free(temp_name);
        return err;
 }
 
 {
        int err;
 
-       err = mount_bpffs_for_pin(name, false);
+       err = mount_bpffs_for_file(name);
        if (err)
                return err;
 
 
 char *get_fdinfo(int fd, const char *key);
 int open_obj_pinned(const char *path, bool quiet);
 int open_obj_pinned_any(const char *path, enum bpf_obj_type exp_type);
-int mount_bpffs_for_pin(const char *name, bool is_dir);
+int mount_bpffs_for_file(const char *file_name);
+int create_and_mount_bpffs_dir(const char *dir_name);
 int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(int *, char ***));
 int do_pin_fd(int fd, const char *name);