diff --git a/sysdeps/generic/dl-protected.h b/sysdeps/generic/dl-protected.h index 88cb8ec917..38386b5200 100644 --- a/sysdeps/generic/dl-protected.h +++ b/sysdeps/generic/dl-protected.h @@ -26,29 +26,33 @@ _dl_check_protected_symbol (const char *undef_name, const struct link_map *map, int type_class) { - if (undef_map != NULL - && undef_map->l_type == lt_executable - && !(undef_map->l_1_needed - & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS) - && (map->l_1_needed - & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)) - { - if ((type_class & ELF_RTYPE_CLASS_COPY)) - /* Disallow copy relocations in executable against protected - data symbols in a shared object which needs indirect external - access. */ - _dl_signal_error (0, map->l_name, undef_name, - N_("copy relocation against non-copyable protected symbol")); - else if (ref->st_value != 0 - && ref->st_shndx == SHN_UNDEF - && (type_class & ELF_RTYPE_CLASS_PLT)) - /* Disallow non-zero symbol values of undefined symbols in - executable, which are used as the function pointer, against - protected function symbols in a shared object with indirect - external access. */ - _dl_signal_error (0, map->l_name, undef_name, - N_("non-canonical reference to canonical protected function")); - } + if (undef_map == NULL || undef_map->l_type != lt_executable) + return; + + if (type_class & ELF_RTYPE_CLASS_COPY) + /* Disallow copy relocations in executable against protected + data symbols in a shared object which needs indirect external + access. */ + _dl_error_printf ("warning: copy relocation against non-copyable " + "protected symbol `%s' in `%s'\n", + undef_name, map->l_name); + else if ((type_class & ELF_RTYPE_CLASS_PLT) && ref->st_value != 0 + && ref->st_shndx == SHN_UNDEF) + /* Disallow non-zero symbol values of undefined symbols in + executable, which are used as the function pointer, against + protected function symbols in a shared object with indirect + external access. */ + _dl_error_printf ( + "warning: direct reference to " + "protected function `%s' in `%s' may break pointer equality\n", + undef_name, map->l_name); + else + return; + + if (map->l_1_needed & GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS) + _dl_signal_error ( + 0, map->l_name, undef_name, + N_ ("error due to GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS")); } #endif /* _DL_PROTECTED_H */