https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82501

--- Comment #11 from Andrey Drobyshev <a.drobyshev at samsung dot com> ---
(In reply to Martin Liška from comment #9)
> (In reply to Andrey Drobyshev from comment #8)
> 
> Great you've been working on that Andrey.
> 
> > I recently started to work on this issue as well. I managed to put a dummy
> > global variable into .data, .rodata and .bss as follows:
> > 
> > static void
> > emit_globals_protector(void)
> > {
> >   tree decl, id, init;
> > 
> >   id = get_identifier ("__asan_dummy_global");
> >   decl = build_decl (BUILTINS_LOCATION, VAR_DECL, id, integer_type_node);
> >   init = build_one_cst(integer_type_node);
> > 
> >   SET_DECL_ASSEMBLER_NAME (decl, id);
> >   TREE_ADDRESSABLE (decl) = 1;
> >   DECL_ARTIFICIAL (decl) = 1;
> >   TREE_STATIC (decl) = 1;
> >   TREE_PUBLIC (decl) = 1;
> >   TREE_USED (decl) = 1;
> > 
> >   TREE_READONLY (init) = 1;      // controls whether variable goes to
> > .rodata or .data
> >   TREE_STATIC (init) = 1;
> >   DECL_INITIAL (decl) = init;    // controls whether variable gets
> > initialized or goes to .bss
> > 
> >   varpool_node::add(decl);
> > }
> > 
> > Calling varpool_node::add() makes sure that created dummy global goes first
> > into the target section, as it leads to call to assemble_variable():
> > 
> > #0  categorize_decl_for_section (decl=0x7ffff7ff4e10, reloc=0) at
> > ../../gcc/varasm.c:6378
> > #1  0x0000000001096112 in default_elf_select_section (decl=0x7ffff7ff4e10,
> > reloc=0, align=256) at ../../gcc/varasm.c:6499
> > #2  0x00000000010b6ce3 in x86_64_elf_select_section (decl=0x7ffff7ff4e10,
> > reloc=0, align=256) at ../../gcc/config/i386/i386.c:6549
> > #3  0x000000000108afd3 in get_variable_section (decl=0x7ffff7ff4e10,
> > prefer_noswitch_p=false) at ../../gcc/varasm.c:1170
> > #4  0x000000000108d70b in assemble_variable (decl=0x7ffff7ff4e10,
> > top_level=0, at_end=1, dont_output_data=0) at ../../gcc/varasm.c:2206
> > #5  0x000000000109fd8a in varpool_node::assemble_decl (this=0x7ffff7281100)
> > at ../../gcc/varpool.c:582
> > #6  0x0000000000917f92 in varpool_node::finalize_decl (decl=0x7ffff7ff4e10)
> > at ../../gcc/cgraphunit.c:823
> > #7  0x000000000109f9c0 in varpool_node::add (decl=0x7ffff7ff4e10) at
> > ../../gcc/varpool.c:473
> > #8  0x000000000091ba93 in emit_globals_protector () at
> > ../../gcc/cgraphunit.c:2187
> > #9  0x000000000091bab6 in output_in_order (no_reorder=false) at
> > ../../gcc/cgraphunit.c:2218
> > #10 0x000000000091c4f4 in symbol_table::compile (this=0x7ffff71280a8) at
> > ../../gcc/cgraphunit.c:2524
> > #11 0x000000000091c73f in symbol_table::finalize_compilation_unit
> > (this=0x7ffff71280a8) at ../../gcc/cgraphunit.c:2620
> > #12 0x0000000000d90fbf in compile_file () at ../../gcc/toplev.c:496
> > #13 0x0000000000d93448 in do_compile () at ../../gcc/toplev.c:1998
> > #14 0x0000000000d936d2 in toplev::main (this=0x7fffffffdbb0, argc=27,
> > argv=0x7fffffffdcb8) at ../../gcc/toplev.c:2106
> > #15 0x00000000016e11d1 in main (argc=27, argv=0x7fffffffdcb8) at
> > ../../gcc/main.c:39
> 
> Can you please provide work-in-progress patch so that I can play with that?
> Is your patch also handling the comment:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82501#c4
>
I guess it's not. I was only able to test this thing on x86_64 and armv7l.

> > 
> > However, there're questions:
> > 1. I wonder is it really possible to emit zero-sized dummies and initialize
> > them as well (i.e. emit them into .data/.rodata)? For now I emit variables
> > of integer types, but that leads to the presence of couple addressable bytes
> > in the beginning of the section.
> 
> I can investigate once I have a patch candidate.
>
Please see attachment above.

> > 2. What should we do with sections like .data.rel.ro, .data.rel.ro.local?
> > They suffer from this bug too, but it's not that easy to put globals there,
> > as you must set various attributes onto decl to ensure it will receive the
> > right reloc value.
> 
> @Jakub: Can you advise please about the question #2?
>
These questions remain unanswered...

Reply via email to