Hi!
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.
Bootstrapped/regtested on x86_64-linux and i686-linux (without offloading)
and Matthias said he has tested it with offloading (I'll do that early next
week when trying to build distro packages), committed to trunk.
2024-11-30 Jakub Jelinek <[email protected]>
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.
--- gcc/lto-wrapper.cc.jj 2024-11-23 13:00:30.083002920 +0100
+++ gcc/lto-wrapper.cc 2024-11-29 21:18:47.362532372 +0100
@@ -1092,13 +1092,16 @@ copy_file (const char *dest, const char
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++)
@@ -1117,7 +1120,8 @@ find_crtoffloadtable (int save_temps, co
}
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' };
@@ -1594,6 +1603,16 @@ run_gcc (unsigned argc, char *argv[])
global_dc->set_show_highlight_colors (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;
}
@@ -1802,7 +1821,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);
--- libgcc/configure.ac.jj 2024-09-24 11:31:48.942619056 +0200
+++ libgcc/configure.ac 2024-11-29 21:05:29.344764142 +0100
@@ -481,7 +481,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.
--- libgcc/Makefile.in.jj 2024-09-24 11:31:48.912619466 +0200
+++ libgcc/Makefile.in 2024-11-29 21:03:22.789545531 +0100
@@ -1064,6 +1064,9 @@ crtoffloadend$(objext): $(srcdir)/offloa
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)
--- libgcc/configure.jj 2024-09-24 11:31:48.941619070 +0200
+++ libgcc/configure 2024-11-29 21:06:28.670929070 +0100
@@ -5295,7 +5295,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.
Jakub