Index: libexec/rtld-elf/rtld.c =================================================================== --- libexec/rtld-elf/rtld.c +++ libexec/rtld-elf/rtld.c @@ -3956,10 +3956,14 @@ donelist_init(&donelist); symlook_init_from_req(&req1, req); - /* Look first in the referencing object if linked symbolically. */ - if (refobj->symbolic && !donelist_check(&donelist, refobj)) { + /* + * Look first in the referencing object if linked symbolically, + * and similarly handle protected symbols. + */ + if (!donelist_check(&donelist, refobj)) { res = symlook_obj(&req1, refobj); - if (res == 0) { + if (res == 0 && (refobj->symbolic || + ELF_ST_VISIBILITY(req1.sym_out->st_other) == STV_PROTECTED)) { req->sym_out = req1.sym_out; req->defobj_out = req1.defobj_out; assert(req->defobj_out != NULL); Index: sys/sys/elf_generic.h =================================================================== --- sys/sys/elf_generic.h +++ sys/sys/elf_generic.h @@ -84,5 +84,6 @@ #define ELF_ST_BIND __ELFN(ST_BIND) #define ELF_ST_TYPE __ELFN(ST_TYPE) #define ELF_ST_INFO __ELFN(ST_INFO) +#define ELF_ST_VISIBILITY __ELFN(ST_VISIBILITY) #endif /* !_SYS_ELF_GENERIC_H_ */