dladdr() out 参数的内存语义
Memory semantics of dladdr() out parameter
dladdr()
的内存语义是什么?
#define _GNU_SOURCE
#include <dlfcn.h>
int dladdr(void *addr, Dl_info *info);
typedef struct {
const char *dli_fname; /* Pathname of shared object that contains address */
void *dli_fbase; /* Base address at which shared object is loaded */
const char *dli_sname; /* Name of symbol whose definition overlaps addr */
void *dli_saddr; /* Exact address of symbol named in dli_sname */
} Dl_info;
阅读手册页,不清楚 dli_fname
:
- 指向常量字符串,永远不需要释放
- 指向堆数组,用户负责删除它
- 指向全局数组(可能不是,因为它声称是可重入的)
我想同样的问题也适用于 dli_sname
,但我怀疑它确实指向一个常量字符串(符号本身)。
用户是否负责删除 dladdr()
返回的 dli_fname
?
这些字符串在通过 dlclose
(直接或间接)卸载对象之前有效。
const char *
表示字符串不能被 dladdr
调用者释放,因为 free
需要 void *
,而不是 const void *
。
dladdr()
的内存语义是什么?
#define _GNU_SOURCE
#include <dlfcn.h>
int dladdr(void *addr, Dl_info *info);
typedef struct {
const char *dli_fname; /* Pathname of shared object that contains address */
void *dli_fbase; /* Base address at which shared object is loaded */
const char *dli_sname; /* Name of symbol whose definition overlaps addr */
void *dli_saddr; /* Exact address of symbol named in dli_sname */
} Dl_info;
阅读手册页,不清楚 dli_fname
:
- 指向常量字符串,永远不需要释放
- 指向堆数组,用户负责删除它
- 指向全局数组(可能不是,因为它声称是可重入的)
我想同样的问题也适用于 dli_sname
,但我怀疑它确实指向一个常量字符串(符号本身)。
用户是否负责删除 dladdr()
返回的 dli_fname
?
这些字符串在通过 dlclose
(直接或间接)卸载对象之前有效。
const char *
表示字符串不能被 dladdr
调用者释放,因为 free
需要 void *
,而不是 const void *
。