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.

Reply via email to