https://gcc.gnu.org/g:326b6bac1f61302daf285e45baf39a6a30511272
commit r14-11149-g326b6bac1f61302daf285e45baf39a6a30511272 Author: Jakub Jelinek <ja...@redhat.com> Date: Sat Nov 30 11:19:12 2024 +0100 openmp: Add crtoffloadtableS.o and use it [PR117851] Unlike crtoffload{begin,end}.o which just define some symbols at the start/end of the various .gnu.offload* sections, crtoffloadtable.o contains const void *const __OFFLOAD_TABLE__[] __attribute__ ((__visibility__ ("hidden"))) = { &__offload_func_table, &__offload_funcs_end, &__offload_var_table, &__offload_vars_end, &__offload_ind_func_table, &__offload_ind_funcs_end, }; The problem is that linking this into PIEs or shared libraries doesn't work when it is compiled without -fpic/-fpie - __OFFLOAD_TABLE__ for non-PIC code is put into .rodata section, but it really needs relocations, so for PIC it should go into .data.rel.ro/.data.rel.ro.local. As I think we don't want .data.rel.ro section in non-PIE binaries, this patch follows the path of e.g. crtbegin.o vs. crtbeginS.o and adds crtoffloadtableS.o next to crtoffloadtable.o, where crtoffloadtableS.o is compiled with -fpic. 2024-11-30 Jakub Jelinek <ja...@redhat.com> PR libgomp/117851 gcc/ * lto-wrapper.cc (find_crtoffloadtable): Add PIE_OR_SHARED argument, search for crtoffloadtableS.o rather than crtoffloadtable.o if true. (run_gcc): Add pie_or_shared variable. If OPT_pie or OPT_shared or OPT_static_pie is seen, set pie_or_shared to true, if OPT_no_pie is seen, set pie_or_shared to false. Pass it to find_crtoffloadtable. libgcc/ * configure.ac (extra_parts): Add crtoffloadtableS.o. * Makefile.in (crtoffloadtableS$(objext)): New goal. * configure: Regenerated. (cherry picked from commit f089ef880e385e2193237b1f53ec81dac4141680) Diff: --- gcc/lto-wrapper.cc | 27 +++++++++++++++++++++++---- libgcc/Makefile.in | 3 +++ libgcc/configure | 3 ++- libgcc/configure.ac | 3 ++- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/gcc/lto-wrapper.cc b/gcc/lto-wrapper.cc index 02579951569d..c7bad4b61c25 100644 --- a/gcc/lto-wrapper.cc +++ b/gcc/lto-wrapper.cc @@ -1083,13 +1083,16 @@ copy_file (const char *dest, const char *src) the copy to the linker. */ static void -find_crtoffloadtable (int save_temps, const char *dumppfx) +find_crtoffloadtable (int save_temps, bool pie_or_shared, const char *dumppfx) { char **paths = NULL; const char *library_path = getenv ("LIBRARY_PATH"); if (!library_path) return; - unsigned n_paths = parse_env_var (library_path, &paths, "/crtoffloadtable.o"); + unsigned n_paths = parse_env_var (library_path, &paths, + pie_or_shared + ? "/crtoffloadtableS.o" + : "/crtoffloadtable.o"); unsigned i; for (i = 0; i < n_paths; i++) @@ -1108,7 +1111,8 @@ find_crtoffloadtable (int save_temps, const char *dumppfx) } if (i == n_paths) fatal_error (input_location, - "installation error, cannot find %<crtoffloadtable.o%>"); + "installation error, cannot find %<crtoffloadtable%s.o%>", + pie_or_shared ? "S" : ""); free_array_of_ptrs ((void **) paths, n_paths); } @@ -1423,6 +1427,11 @@ run_gcc (unsigned argc, char *argv[]) char **lto_argv, **ltoobj_argv; bool linker_output_rel = false; bool skip_debug = false; +#ifdef ENABLE_DEFAULT_PIE + bool pie_or_shared = true; +#else + bool pie_or_shared = false; +#endif const char *incoming_dumppfx = dumppfx = NULL; static char current_dir[] = { '.', DIR_SEPARATOR, '\0' }; @@ -1590,6 +1599,16 @@ run_gcc (unsigned argc, char *argv[]) diagnostic_color_init (global_dc, option->value); break; + case OPT_pie: + case OPT_shared: + case OPT_static_pie: + pie_or_shared = true; + break; + + case OPT_no_pie: + pie_or_shared = false; + break; + default: break; } @@ -1798,7 +1817,7 @@ cont1: if (offload_names) { - find_crtoffloadtable (save_temps, dumppfx); + find_crtoffloadtable (save_temps, pie_or_shared, dumppfx); for (i = 0; offload_names[i]; i++) printf ("%s\n", offload_names[i]); free_array_of_ptrs ((void **) offload_names, i); diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in index 0e46e9ef7686..5d0195bdfe90 100644 --- a/libgcc/Makefile.in +++ b/libgcc/Makefile.in @@ -1060,6 +1060,9 @@ crtoffloadend$(objext): $(srcdir)/offloadstuff.c crtoffloadtable$(objext): $(srcdir)/offloadstuff.c $(crt_compile) $(CRTSTUFF_T_CFLAGS) -c $< -DCRT_TABLE + +crtoffloadtableS$(objext): $(srcdir)/offloadstuff.c + $(crt_compile) $(CRTSTUFF_T_CFLAGS_S) -c $< -DCRT_TABLE endif ifeq ($(enable_vtable_verify),yes) diff --git a/libgcc/configure b/libgcc/configure index cff1eff96256..23cc5753bac4 100755 --- a/libgcc/configure +++ b/libgcc/configure @@ -5326,7 +5326,8 @@ fi if test x"$enable_offload_targets" != x; then - extra_parts="${extra_parts} crtoffloadbegin.o crtoffloadend.o crtoffloadtable.o" + extra_parts="${extra_parts} crtoffloadbegin.o crtoffloadend.o" + extra_parts="${extra_parts} crtoffloadtable.o crtoffloadtableS.o" fi # Check if Solaris/x86 linker supports ZERO terminator unwind entries. diff --git a/libgcc/configure.ac b/libgcc/configure.ac index 4e8c036990f0..bbe34cb7fb16 100644 --- a/libgcc/configure.ac +++ b/libgcc/configure.ac @@ -506,7 +506,8 @@ AC_SUBST(accel_dir_suffix) AC_SUBST(real_host_noncanonical) if test x"$enable_offload_targets" != x; then - extra_parts="${extra_parts} crtoffloadbegin.o crtoffloadend.o crtoffloadtable.o" + extra_parts="${extra_parts} crtoffloadbegin.o crtoffloadend.o" + extra_parts="${extra_parts} crtoffloadtable.o crtoffloadtableS.o" fi # Check if Solaris/x86 linker supports ZERO terminator unwind entries.