The fuse_session_loop_mt() and fuse_loop_mt() symbols are only visible
when linking against the shared object. The code in lib/, however, is
compiled *into* the shared object and should thus use the internal
names of these functions.
Surprisingly enough, the code still worked before - but only when link
time optimization was disabled.
Unfortunately, we still can't compile with LTO because it seems that
enabling LTO somehow makes the tagged symbols vanish.
Without lto, we have:
$ nm lib/libfuse3.so | grep fuse_new
0000000000011070 T fuse_new_30
0000000000010a00 t fuse_new_31
0000000000011070 T fuse_new@FUSE_3.0
0000000000010a00 T fuse_new@@FUSE_3.1
and with LTO:
$ nm lib/libfuse3.so | grep fuse_new
0000000000019a70 T fuse_new_30
0000000000019270 t fuse_new_31
See also issue #198.
struct fuse_loop_config config;
config.clone_fd = 0;
config.max_idle_threads = 10;
- res = fuse_session_loop_mt(se, &config);
+ res = fuse_session_loop_mt_32(se, &config);
}
else
res = fuse_session_loop(se);
return fuse_session_loop(f->se);
}
-int fuse_loop_mt_32(struct fuse *f, struct fuse_loop_config *config);
FUSE_SYMVER(".symver fuse_loop_mt_32,fuse_loop_mt@@FUSE_3.2");
int fuse_loop_mt_32(struct fuse *f, struct fuse_loop_config *config)
{
if (res)
return -1;
- res = fuse_session_loop_mt(fuse_get_session(f), config);
+ res = fuse_session_loop_mt_32(fuse_get_session(f), config);
fuse_stop_cleanup_thread(f);
return res;
}
}
-/* Explicit prototype to prevent compiler warnings
- (fuse.h only defines fuse_new()) */
FUSE_SYMVER(".symver fuse_new_31,fuse_new@@FUSE_3.1");
struct fuse *fuse_new_31(struct fuse_args *args,
const struct fuse_operations *op,
struct fuse *fuse_new_31(struct fuse_args *args, const struct fuse_operations *op,
size_t op_size, void *private_data);
+int fuse_loop_mt_32(struct fuse *f, struct fuse_loop_config *config);
+int fuse_session_loop_mt_32(struct fuse_session *se, struct fuse_loop_config *config);
+
free(w);
}
-int fuse_session_loop_mt_32(struct fuse_session *se, struct fuse_loop_config *config);
FUSE_SYMVER(".symver fuse_session_loop_mt_32,fuse_session_loop_mt@@FUSE_3.2");
int fuse_session_loop_mt_32(struct fuse_session *se, struct fuse_loop_config *config)
{
struct fuse_loop_config loop_config;
loop_config.clone_fd = opts.clone_fd;
loop_config.max_idle_threads = opts.max_idle_threads;
- res = fuse_loop_mt(fuse, &loop_config);
+ res = fuse_loop_mt_32(fuse, &loop_config);
}
if (res)
res = 1;