Avoid implying that use of IFUNC is the only way to produce a symbol with NULL value. Give more scenarios how a symbol may get NULL value, but explain that in those scenarios dlsym will fail with Glibc ld.so due to an implementation inconsistency. Signed-off-by: Alexander Monakov <amonakov@xxxxxxxxx> --- Hello! Michael, in https://stackoverflow.com/questions/13941944/why-can-the-value-of-the-symbol-returned-by-dlsym-be-null you're in agreement with Petr Skocik that dlsym failure on NULL absolute symbols is a Glibc bug. I'm also in agreement. In any case, current wording implies that apart from IFUNC there's no way a symbol will have NULL value, which is not true: the symbol may have NULL value, only it can't be looked up via dlsym. This patch clarifies the situation. Thanks. Alexander man3/dlsym.3 | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/man3/dlsym.3 b/man3/dlsym.3 index 8a1ae7789..5ea151209 100644 --- a/man3/dlsym.3 +++ b/man3/dlsym.3 @@ -143,16 +143,22 @@ The .BR dlvsym () function is a GNU extension. .SH NOTES -The value of a symbol returned by +There are several scenarios when the address of a global symbol is NULL. +For example, a symbol can be placed at zero address by the linker, via +a linker script or with +.I --defsym +command-line option. Undefined weak symbols also have NULL value. +Finally, the symbol value may be the result of +a GNU indirect function (IFUNC) resolver function that returns +NULL as the resolved value. In the latter case, .BR dlsym () -will never be NULL if the shared object is the result of normal compilation, -since a global symbol is never placed at the NULL address. -There are nevertheless cases where a lookup using +also returns NULL without error. However, in the former two cases, the +behavior of GNU dynamic linker is inconsistent: relocation processing +succeeds and the symbol can be observed to have NULL value, but .BR dlsym () -may return NULL as the value of a symbol. -For example, the symbol value may be the result of -a GNU indirect function (IFUNC) resolver function that returns -NULL as the resolved value. +fails and +.BR dlerror () +indicates a lookup error. .\" .SS History The -- 2.11.0