Actually, I guessed the flags: % ../gcc-inst/bin/g++ -g -fsanitize=address -static-libasan -O2 -flto -fno-use-linker-plugin -flto-partition=none ../gcc/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c; ./a.out 2>&1
/tmp/ccgSw6NI.lto.o: In function `main': ../gcc/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c:13: undefined reference to `.LASANPC0.2585' collect2: error: ld returned 1 exit status Looks like this patch is not friendly to -flto --kcc On Tue, Oct 29, 2013 at 4:54 PM, Konstantin Serebryany <konstantin.s.serebry...@gmail.com> wrote: > Jakub, > > Your patch seems to do what it should: > > % ../gcc-inst/bin/g++ -gdwarf-2 -fsanitize=address -static-libasan > ../gcc/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c && ./a.out > ... > Address 0x7fffb8ec95ca is located in stack of thread T0 at offset 42 in frame > #0 0x44bd73 in main > ../gcc/gcc/testsuite/c-c++-common/asan/stack-overflow-1.c:13 > > But now when I run the tests I get this: > > FAIL: c-c++-common/asan/clone-test-1.c -O2 -flto > -fno-use-linker-plugin -flto-partition=none (test for excess errors) > FAIL: c-c++-common/asan/clone-test-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects (test for excess errors) > FAIL: c-c++-common/asan/memcmp-1.c -O2 -flto -fno-use-linker-plugin > -flto-partition=none (test for excess errors) > FAIL: c-c++-common/asan/memcmp-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects (test for excess errors) > FAIL: c-c++-common/asan/stack-overflow-1.c -O2 -flto > -fno-use-linker-plugin -flto-partition=none (test for excess errors) > FAIL: c-c++-common/asan/stack-overflow-1.c -O2 -flto > -fuse-linker-plugin -fno-fat-lto-objects (test for excess errors) > FAIL: c-c++-common/asan/swapcontext-test-1.c -O2 -flto > -fno-use-linker-plugin -flto-partition=none (test for excess errors) > FAIL: c-c++-common/asan/swapcontext-test-1.c -O2 -flto > -fuse-linker-plugin -fno-fat-lto-objects (test for excess errors) > FAIL: g++.dg/asan/deep-thread-stack-1.C -O2 -flto > -fno-use-linker-plugin -flto-partition=none (test for excess errors) > FAIL: g++.dg/asan/deep-thread-stack-1.C -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects (test for excess errors) > > W/o your change they pass. > Could you please remind me how to debug this (i.e. how to run the > exact test commands manually)? > > Thanks! > --kcc > > On Tue, Oct 29, 2013 at 6:49 AM, Konstantin Serebryany > <konstantin.s.serebry...@gmail.com> wrote: >> Thanks! >> (At this time I will be slow with response due to travel) >> >> --kcc >> >> >> On Tue, Oct 29, 2013 at 5:13 AM, Jakub Jelinek <ja...@redhat.com> wrote: >>> >>> > On Wed, Oct 2, 2013 at 12:51 PM, Konstantin Serebryany >>> > > 2013-10-XX Kostya Serebryany <k...@google.com> >>> > > >>> > > * g++.dg/asan/asan_test.cc: Update the test >>> > > to match the fresh asan run-time. >>> > > * c-c++-common/asan/stack-overflow-1.c: Ditto. >>> > > >>> > > =========== gcc/ChangeLog >>> > > >>> > > 2013-10-XX Kostya Serebryany <k...@google.com> >>> > > >>> > > * asan.c: Update to match the changed asan API. >>> > > (asan_emit_stack_protection): update the string stored in the >>> > > stack red zone to match new API. Store the PC of the current >>> > > function in the red zone. >>> > > (asan_global_struct): update the __asan_global definition to >>> > > match >>> > > the new API. >>> > > (asan_add_global): Ditto. >>> > > * sanitizer.def: rename __asan_init_v1 to __asan_init_v3 >>> >>> The "Update to match the changed asan API." should either be >>> dropped, or come on a line before the * asan.c >>> (asan_emit_stack_protection): >>> line. All descriptions should start with capital letters, end with ., two >>> spaces after . if followed by another sentence. >>> >>> Besides that, here is (completely untested) attempt to give you >>> the pc of the first instruction of the function and two minor changes >>> (pp_string (something, "") is useless and in two spots I've noticed >>> you didn't add space before ( in function call). >>> >>> Finally, if the new libasan is ABI incompatible with the old one, which >>> seems it is, then libsanitizer/asan/libtool-version (and perhaps also >>> libsanitizer/tsan/libtool-version, haven't looked if that one is ABI >>> compatible or not) needs to be bumped (to 1:0:0 ?). >>> >>> --- gcc/asan.c.jj 2013-10-29 11:58:30.000000000 +0100 >>> +++ gcc/asan.c 2013-10-29 13:04:07.709667677 +0100 >>> @@ -921,6 +921,15 @@ asan_clear_shadow (rtx shadow_mem, HOST_ >>> add_int_reg_note (jump, REG_BR_PROB, REG_BR_PROB_BASE * 80 / 100); >>> } >>> >>> +void >>> +asan_function_start (void) >>> +{ >>> + section *fnsec = function_section (current_function_decl); >>> + switch_to_section (fnsec); >>> + ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LASANPC", >>> + current_function_funcdef_no); >>> +} >>> + >>> /* Insert code to protect stack vars. The prologue sequence should be >>> emitted >>> directly, epilogue sequence returned. BASE is the register holding >>> the >>> stack base, against which OFFSETS array offsets are relative to, >>> OFFSETS >>> @@ -936,12 +945,13 @@ asan_emit_stack_protection (rtx base, HO >>> int length) >>> { >>> rtx shadow_base, shadow_mem, ret, mem; >>> + char buf[30]; >>> unsigned char shadow_bytes[4]; >>> HOST_WIDE_INT base_offset = offsets[length - 1], offset, prev_offset; >>> HOST_WIDE_INT last_offset, last_size; >>> int l; >>> unsigned char cur_shadow_byte = ASAN_STACK_MAGIC_LEFT; >>> - tree str_cst; >>> + tree str_cst, decl; >>> >>> if (shadow_ptr_types[0] == NULL_TREE) >>> asan_init_shadow_ptr_types (); >>> @@ -949,7 +959,6 @@ asan_emit_stack_protection (rtx base, HO >>> /* First of all, prepare the description string. */ >>> pretty_printer asan_pp; >>> >>> - pp_string (&asan_pp, ""); >>> pp_decimal_int (&asan_pp, length / 2 - 1); >>> pp_space (&asan_pp); >>> for (l = length - 2; l; l -= 2) >>> @@ -980,7 +989,17 @@ asan_emit_stack_protection (rtx base, HO >>> mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode)); >>> emit_move_insn (mem, expand_normal (str_cst)); >>> mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode)); >>> - emit_move_insn (mem, expand_normal (str_cst)); // FIXME: should be >>> cur_pc. >>> + ASM_GENERATE_INTERNAL_LABEL (buf, "LASANPC", >>> current_function_funcdef_no); >>> + decl = build_decl (DECL_SOURCE_LOCATION (current_function_decl), >>> + VAR_DECL, get_identifier (buf), char_type_node); >>> + TREE_ADDRESSABLE (decl) = 1; >>> + TREE_READONLY (decl) = 1; >>> + DECL_ARTIFICIAL (decl) = 1; >>> + DECL_IGNORED_P (decl) = 1; >>> + TREE_STATIC (decl) = 1; >>> + TREE_PUBLIC (decl) = 0; >>> + TREE_USED (decl) = 1; >>> + emit_move_insn (mem, expand_normal (build_fold_addr_expr (decl))); >>> shadow_base = expand_binop (Pmode, lshr_optab, base, >>> GEN_INT (ASAN_SHADOW_SHIFT), >>> NULL_RTX, 1, OPTAB_DIRECT); >>> @@ -1979,8 +1998,8 @@ asan_add_global (tree decl, tree type, v >>> pp_string (&asan_pp, "<unknown>"); >>> str_cst = asan_pp_string (&asan_pp); >>> >>> - pp_string(&module_name_pp, main_input_filename); >>> - module_name_cst = asan_pp_string(&module_name_pp); >>> + pp_string (&module_name_pp, main_input_filename); >>> + module_name_cst = asan_pp_string (&module_name_pp); >>> >>> if (asan_needs_local_alias (decl)) >>> { >>> --- gcc/asan.h.jj 2013-01-11 09:02:50.000000000 +0100 >>> +++ gcc/asan.h 2013-10-29 12:37:54.190798947 +0100 >>> @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. >>> #ifndef TREE_ASAN >>> #define TREE_ASAN >>> >>> +extern void asan_function_start (void); >>> extern void asan_finish_file (void); >>> extern rtx asan_emit_stack_protection (rtx, HOST_WIDE_INT *, tree *, >>> int); >>> extern bool asan_protect_global (tree); >>> --- gcc/final.c.jj 2013-10-23 14:43:12.000000000 +0200 >>> +++ gcc/final.c 2013-10-29 12:49:33.609176613 +0100 >>> @@ -78,6 +78,7 @@ along with GCC; see the file COPYING3. >>> #include "cfgloop.h" >>> #include "params.h" >>> #include "tree-pretty-print.h" /* for dump_function_header */ >>> +#include "asan.h" >>> >>> #ifdef XCOFF_DEBUGGING_INFO >>> #include "xcoffout.h" /* Needed for external data >>> @@ -1738,6 +1739,9 @@ final_start_function (rtx first, FILE *f >>> >>> high_block_linenum = high_function_linenum = last_linenum; >>> >>> + if (flag_sanitize & SANITIZE_ADDRESS) >>> + asan_function_start (); >>> + >>> if (!DECL_IGNORED_P (current_function_decl)) >>> debug_hooks->begin_prologue (last_linenum, last_filename); >>> >>> >>> >>> Jakub >> >>