Hi there, Not sure if this is generic to any gcc target, or it just happens for avr, given previous mentioned problems with the .data section dissappearing (due to -gc-sections) causing .bss to be resolved to the wrong addresses for avr...
Anyway, this is my test case and what happens, which does not happen in the Atmel latest published toolchain: Test program is: $ cat gcc-data-sections.c #if MAKE_A_PROBLEM #if MAKE_IT_WORK __attribute__((section(".my.tables.things.data"))) #endif/*MAKE_IT_WORK*/ extern unsigned long my_thing_1; static unsigned long *my_local_thing = &my_thing_1; #else /*MAKE_A_PROBLEM*/ static unsigned long *my_local_thing; #endif/*MAKE_A_PROBLEM*/ __attribute__((section(".my.tables.things.data"))) unsigned long my_thing_1 = 0x600df00d; void my_dummy(void) { (void) my_local_thing; /*avoid a warning*/ } When compiling with: $ avr-gcc -mmcu=atxmega256a3u -Wa,-mmcu=atxmega256a3u -Os -g -fsigned-char -ffunction-sections -fdata-sections -Wall -Wextra -Werror -std=gnu99 -DMAKE_A_PROBLEM=1 -DMAKE_IT_WORK=0 -c -o gcc-data-sections.o gcc-data-sections.c as it is usually done (and does work in the atmel toolchain), I get: $ avr-objdump -h gcc-data-sections.o gcc-data-sections.o: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000000 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 00000000 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000034 2**0 ALLOC 3 .text.my_dummy 00000002 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 4 .data.my_thing_1 00000004 00000000 00000000 00000036 2**0 CONTENTS, ALLOC, LOAD, DATA 5 .debug_info 00000067 00000000 00000000 0000003a 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 6 .debug_abbrev 00000060 00000000 00000000 000000a1 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_aranges 00000020 00000000 00000000 00000101 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 8 .debug_ranges 00000010 00000000 00000000 00000121 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 9 .debug_line 00000043 00000000 00000000 00000131 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 10 .debug_str 000000e7 00000000 00000000 00000174 2**0 CONTENTS, READONLY, DEBUGGING 11 .comment 0000002b 00000000 00000000 0000025b 2**0 CONTENTS, READONLY 12 .debug_frame 00000024 00000000 00000000 00000288 2**2 CONTENTS, RELOC, READONLY, DEBUGGING With my_thing_1 not going into its assigned section as it should. Found that is due to the previous extern declaration, which seems to work if it is removed: $ avr-gcc -mmcu=atxmega256a3u -Wa,-mmcu=atxmega256a3u -Os -g -fsigned-char -ffunction-sections -fdata-sections -Wall -Wextra -Werror -std=gnu99 -DMAKE_A_PROBLEM=0 -DMAKE_IT_WORK=0 -c -o gcc-data-sections.o gcc-data-sections.c $ avr-objdump -h gcc-data-sections.o gcc-data-sections.o: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000000 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 00000000 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000034 2**0 ALLOC 3 .text.my_dummy 00000002 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 4 .my.tables.things.data 00000004 00000000 00000000 00000036 2**0 CONTENTS, ALLOC, LOAD, DATA 5 .debug_info 00000060 00000000 00000000 0000003a 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 6 .debug_abbrev 0000005e 00000000 00000000 0000009a 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_aranges 00000020 00000000 00000000 000000f8 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 8 .debug_ranges 00000010 00000000 00000000 00000118 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 9 .debug_line 00000043 00000000 00000000 00000128 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 10 .debug_str 000000e7 00000000 00000000 0000016b 2**0 CONTENTS, READONLY, DEBUGGING 11 .comment 0000002b 00000000 00000000 00000252 2**0 CONTENTS, READONLY 12 .debug_frame 00000024 00000000 00000000 00000280 2**2 CONTENTS, RELOC, READONLY, DEBUGGING or if it is annotated with the same section attribute: $ avr-gcc -mmcu=atxmega256a3u -Wa,-mmcu=atxmega256a3u -Os -g -fsigned-char -ffunction-sections -fdata-sections -Wall -Wextra -Werror -std=gnu99 -DMAKE_A_PROBLEM=1 -DMAKE_IT_WORK=1 -c -o gcc-data-sections.o gcc-data-sections.c $ avr-objdump -h gcc-data-sections.o gcc-data-sections.o: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000000 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 00000000 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000034 2**0 ALLOC 3 .text.my_dummy 00000002 00000000 00000000 00000034 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 4 .my.tables.things.data 00000004 00000000 00000000 00000036 2**0 CONTENTS, ALLOC, LOAD, DATA 5 .debug_info 00000067 00000000 00000000 0000003a 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 6 .debug_abbrev 00000060 00000000 00000000 000000a1 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_aranges 00000020 00000000 00000000 00000101 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 8 .debug_ranges 00000010 00000000 00000000 00000121 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 9 .debug_line 00000043 00000000 00000000 00000131 2**0 CONTENTS, RELOC, READONLY, DEBUGGING 10 .debug_str 000000e7 00000000 00000000 00000174 2**0 CONTENTS, READONLY, DEBUGGING 11 .comment 0000002b 00000000 00000000 0000025b 2**0 CONTENTS, READONLY 12 .debug_frame 00000024 00000000 00000000 00000288 2**2 CONTENTS, RELOC, READONLY, DEBUGGING The trunk version that I built (using also trunk binutils and trunk avr-libc) is: $ avr-gcc -v Using built-in specs. COLLECT_GCC=avr-gcc COLLECT_LTO_WRAPPER=/misc/apps/avr8/tools_002/libexec/gcc/avr/4.10.0/lto-wrapper Target: avr Configured with: /home/df/src/gcc-trunk/configure --prefix=/misc/apps/avr8/tools_002 --target=avr --enable-languages=c,c++ --with-gnu-as --with-gnu-ld --with-dwarf2 --with-avrlibc=yes --enable-fixed-point --enable-doc --disable-libssp --disable-libada --disable-shared -v Thread model: single gcc version 4.10.0 20140729 (experimental) (GCC) The atmel gcc is: $ avr-gcc -v Using built-in specs. COLLECT_GCC=avr-gcc COLLECT_LTO_WRAPPER=/misc/apps/avr8/avr8-gnu-toolchain-linux_x86_64/bin/../libexec/gcc/avr/4.8.1/lto-wrapper Target: avr Configured with: /data2/home/toolsbuild/jenkins-knuth/workspace/avr8-gnu-toolchain/src/gcc/configure LDFLAGS=-L/home/toolsbuild/jenkins-knuth/workspace/avr8-gnu-toolchain/avr8-gnu-toolchain-linux_x86_64/lib CPPFLAGS= --target=avr --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/home/toolsbuild/jenkins-knuth/workspace/avr8-gnu-toolchain/avr8-gnu-toolchain-linux_x86_64 --libdir=/home/toolsbuild/jenkins-knuth/workspace/avr8-gnu-toolchain/avr8-gnu-toolchain-linux_x86_64/lib --enable-languages=c,c++ --with-dwarf2 --enable-doc --disable-shared --disable-libada --disable-libssp --disable-nls --with-avrlibc=yes --with-mpfr=/home/toolsbuild/jenkins-knuth/workspace/avr8-gnu-toolchain/avr8-gnu-toolchain-linux_x86_64 --with-gmp=/home/toolsbuild/jenkins-knuth/workspace/avr8-gnu-toolchain/avr8-gnu-toolchain-linux_x86_64 --with-mpc=/home/toolsbuild/jenkins-knuth/workspace/avr8-gnu-toolchain/avr8-gnu-toolchain-linux_x86_64 --enable-fixed-point --with-pkgversion=AVR_8_bit_GNU_Toolchain_3.4.3_1072 --with-bugurl=http://www.atmel.com Thread model: single gcc version 4.8.1 (AVR_8_bit_GNU_Toolchain_3.4.3_1072) Other than that (and a bit pickier with aggregate initializers that don't include all the elements), it builds functional firmware properly. So I guess I would like you guys to confirm that this is a bug or regression, and let me know the bug reference if any. Greetings David Fernandez