From 52d094802284787ac06b100850f05b76ac81d5de Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Thu, 17 Jun 2021 20:31:32 +0200 Subject: [PATCH] Export libthread_db symbols under GLBIC_PRIVATE (#1965374) --- glibc-libthread_db-dynsym.patch | 191 ++++++++++++++++++++++++++++++++ glibc.spec | 6 +- 2 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 glibc-libthread_db-dynsym.patch diff --git a/glibc-libthread_db-dynsym.patch b/glibc-libthread_db-dynsym.patch new file mode 100644 index 0000000..0fdc8c4 --- /dev/null +++ b/glibc-libthread_db-dynsym.patch @@ -0,0 +1,191 @@ +Author: Florian Weimer +Date: Thu Jun 17 19:23:00 2021 +0200 + + nptl: Export libthread_db-used symbols under GLIBC_PRIVATE + + This allows distributions to strip debugging information from + libc.so.6 without impacting the debugging experience. + + nptl_version had to be renamed to __nptl_version to avoid + namespace issues. + +diff --git a/nptl/Versions b/nptl/Versions +index 62bb939d54..c03ed92848 100644 +--- a/nptl/Versions ++++ b/nptl/Versions +@@ -403,10 +403,14 @@ libc { + __nptl_deallocate_tsd; + __nptl_death_event; + __nptl_free_tcb; ++ __nptl_last_event; + __nptl_nthreads; ++ __nptl_rtld_global; + __nptl_setxid_sighandler; + __nptl_stack_list_add; + __nptl_stack_list_del; ++ __nptl_threads_events; ++ __nptl_version; + __pthread_attr_copy; + __pthread_attr_destroy; + __pthread_attr_init; +@@ -430,6 +434,58 @@ libc { + __pthread_unwind; + __sched_fifo_max_prio; + __sched_fifo_min_prio; ++ _thread_db___nptl_last_event; ++ _thread_db___nptl_rtld_global; ++ _thread_db_const_thread_area; ++ _thread_db_dtv_dtv; ++ _thread_db_dtv_slotinfo_gen; ++ _thread_db_dtv_slotinfo_list_len; ++ _thread_db_dtv_slotinfo_list_next; ++ _thread_db_dtv_slotinfo_list_slotinfo; ++ _thread_db_dtv_slotinfo_map; ++ _thread_db_dtv_t_counter; ++ _thread_db_dtv_t_pointer_val; ++ _thread_db_link_map_l_tls_modid; ++ _thread_db_link_map_l_tls_offset; ++ _thread_db_list_t_next; ++ _thread_db_list_t_prev; ++ _thread_db_pthread_cancelhandling; ++ _thread_db_pthread_dtvp; ++ _thread_db_pthread_eventbuf; ++ _thread_db_pthread_eventbuf_eventmask; ++ _thread_db_pthread_eventbuf_eventmask_event_bits; ++ _thread_db_pthread_key_data_data; ++ _thread_db_pthread_key_data_level2_data; ++ _thread_db_pthread_key_data_seq; ++ _thread_db_pthread_key_struct_destr; ++ _thread_db_pthread_key_struct_seq; ++ _thread_db_pthread_list; ++ _thread_db_pthread_nextevent; ++ _thread_db_pthread_report_events; ++ _thread_db_pthread_schedparam_sched_priority; ++ _thread_db_pthread_schedpolicy; ++ _thread_db_pthread_specific; ++ _thread_db_pthread_start_routine; ++ _thread_db_pthread_tid; ++ _thread_db_register32; ++ _thread_db_register32_thread_area; ++ _thread_db_register64; ++ _thread_db_register64_thread_area; ++ _thread_db_rtld_global__dl_stack_used; ++ _thread_db_rtld_global__dl_stack_user; ++ _thread_db_rtld_global__dl_tls_dtv_slotinfo_list; ++ _thread_db_sizeof_dtv_slotinfo; ++ _thread_db_sizeof_dtv_slotinfo_list; ++ _thread_db_sizeof_list_t; ++ _thread_db_sizeof_pthread; ++ _thread_db_sizeof_pthread_key_data; ++ _thread_db_sizeof_pthread_key_data_level2; ++ _thread_db_sizeof_pthread_key_struct; ++ _thread_db_sizeof_td_eventbuf_t; ++ _thread_db_sizeof_td_thr_events_t; ++ _thread_db_td_eventbuf_t_eventdata; ++ _thread_db_td_eventbuf_t_eventnum; ++ _thread_db_td_thr_events_t_event_bits; + } + } + +diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c +index 3f017f1e26..d1b6817a81 100644 +--- a/nptl/pthread_create.c ++++ b/nptl/pthread_create.c +@@ -43,21 +43,24 @@ + + + /* Globally enabled events. */ +-static td_thr_events_t __nptl_threads_events __attribute_used__; ++td_thr_events_t __nptl_threads_events __attribute__ ((nocommon)); ++libc_hidden_proto (__nptl_threads_events) ++libc_hidden_data_def (__nptl_threads_events) + + /* Pointer to descriptor with the last event. */ +-static struct pthread *__nptl_last_event __attribute_used__; ++struct pthread *__nptl_last_event __attribute__ ((nocommon)); ++libc_hidden_proto (__nptl_last_event) ++libc_hidden_data_def (__nptl_last_event) + + #ifdef SHARED + /* This variable is used to access _rtld_global from libthread_db. If + GDB loads libpthread before ld.so, it is not possible to resolve + _rtld_global directly during libpthread initialization. */ +-static struct rtld_global *__nptl_rtld_global __attribute_used__ +- = &_rtld_global; ++struct rtld_global *__nptl_rtld_global = &_rtld_global; + #endif + + /* Version of the library, used in libthread_db to detect mismatches. */ +-static const char nptl_version[] __attribute_used__ = VERSION; ++const char __nptl_version[] = VERSION; + + /* This performs the initialization necessary when going from + single-threaded to multi-threaded mode for the first time. */ +diff --git a/nptl_db/Makefile b/nptl_db/Makefile +index ea721c1dcf..4cc51c0e7b 100644 +--- a/nptl_db/Makefile ++++ b/nptl_db/Makefile +@@ -57,7 +57,7 @@ include ../Rules + + $(objpfx)db-symbols.out: $(objpfx)db-symbols.v.i \ + $(common-objpfx)libc.so +- LC_ALL=C $(READELF) -W -s $(filter %.so,$^) | $(AWK) -f $< > $@; \ ++ LC_ALL=C $(READELF) -W -D -s $(filter %.so,$^) | $(AWK) -f $< > $@; \ + $(evaluate-test) + + $(objpfx)db-symbols.v.i: db-symbols.awk +diff --git a/nptl_db/db-symbols.awk b/nptl_db/db-symbols.awk +index 6f326cf379..2033f95e38 100644 +--- a/nptl_db/db-symbols.awk ++++ b/nptl_db/db-symbols.awk +@@ -13,7 +13,7 @@ BEGIN { + in_symtab = 0; + } + +-/Symbol table '.symtab'/ { in_symtab=1; next } ++/Symbol table for image/ { in_symtab=1; next } + NF == 0 { in_symtab=0; next } + + !in_symtab { next } +@@ -24,6 +24,7 @@ END { + status = 0; + + for (s in required) { ++ s = s "@@GLIBC_PRIVATE" + if (s in seen) print s, "ok"; + else { + status = 1; +@@ -33,6 +34,7 @@ END { + + any = ""; + for (s in th_unique) { ++ s = s "@@GLIBC_PRIVATE" + if (s in seen) { + any = s; + break; +diff --git a/nptl_db/structs.def b/nptl_db/structs.def +index 6a726f207e..e2e51acc39 100644 +--- a/nptl_db/structs.def ++++ b/nptl_db/structs.def +@@ -77,7 +77,7 @@ DB_STRUCT (td_eventbuf_t) + DB_STRUCT_FIELD (td_eventbuf_t, eventnum) + DB_STRUCT_FIELD (td_eventbuf_t, eventdata) + +-DB_SYMBOL (nptl_version) ++DB_SYMBOL (__nptl_version) + DB_MAIN_SYMBOL (__nptl_create_event) + DB_MAIN_SYMBOL (__nptl_death_event) + DB_SYMBOL (__nptl_threads_events) +diff --git a/nptl_db/td_ta_new.c b/nptl_db/td_ta_new.c +index 501d922ea2..eeca29d5a0 100644 +--- a/nptl_db/td_ta_new.c ++++ b/nptl_db/td_ta_new.c +@@ -39,7 +39,7 @@ td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta) + LOG ("td_ta_new"); + + /* Check whether the versions match. */ +- if (td_lookup (ps, SYM_nptl_version, &versaddr) != PS_OK) ++ if (td_lookup (ps, SYM___nptl_version, &versaddr) != PS_OK) + return TD_NOLIBTHREAD; + if (ps_pdread (ps, versaddr, versbuf, sizeof (versbuf)) != PS_OK) + return TD_ERR; diff --git a/glibc.spec b/glibc.spec index e862db7..a28fff8 100644 --- a/glibc.spec +++ b/glibc.spec @@ -97,7 +97,7 @@ Summary: The GNU libc libraries Name: glibc Version: %{glibcversion} -Release: 21%{?dist} +Release: 22%{?dist} # In general, GPLv2+ is used by programs, LGPLv2+ is used for # libraries. @@ -178,6 +178,7 @@ Patch34: glibc-nosymlink-1.patch Patch35: glibc-nosymlink-2.patch Patch36: glibc-nosymlink-3.patch Patch37: glibc-nosymlink-4.patch +Patch38: glibc-libthread_db-dynsym.patch ############################################################################## # Continued list of core "glibc" package information: @@ -2189,6 +2190,9 @@ fi %files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared %changelog +* Thu Jun 17 2021 Florian Weimer - 2.33.9000-22 +- Export libthread_db symbols under GLBIC_PRIVATE (#1965374) + * Thu Jun 17 2021 Florian Weimer - 2.33.9000-21 - Redo the crafted libc.so.6 symbol table for valgrind (#1965374)