I have added a new function (fuse_lowlevel_notify_inval_directory) in user space fuse library. The compilation and creation of libfuse.so is finished without error. But when my application tries to use this new function, the linker is throwing error: undefined reference to `fuse_lowlevel_notify_inval_directory' collect2: ld returned 1 exit status
When I checked with nm
nm ../libfuse.so | grep inval
00000000000154ed T fuse_invalidate
**000000000001e142 t fuse_lowlevel_notify_inval_directory**
000000000001e26c T fuse_lowlevel_notify_inval_entry
000000000001e1cb T fuse_lowlevel_notify_inval_inode
T/t means the symbol is present in text section. if uppercase, the symbol is global (external). I suspect this is the issue. The new added function is showing lowercase t while other older functions are having upper case T. Any idea about what I might be doing wrong?
Any idea about what I might be doing wrong?
The t function is indeed local to the library. This could happen due to a number or reasons. The most likely ones are:
- You declared the function
static, or - You compiled the library with
-fvisibility=hiddenand did not have__attribure__((visibility("default")))on the function, or - You linked this library with a linker version script (i.e. with
--version-script=libfoo.versionflag) that hides all functions, except those which are explicitly exported, and you didn't add your function to that list.
See this example of using--version-scriptto limit symbol visibility.
来源:https://stackoverflow.com/questions/37531846/nm-symbol-output-t-vs-t-in-a-shared-so-library