aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sysdeps/generic/dl-protected.h50
1 files changed, 27 insertions, 23 deletions
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 */