Fwd: avr-gcc (compiled from trunk) not placing objects in attributed sections in some cases.
David Fernandez
david.fernandez.work@googlemail.com
Mon Aug 4 07:44:00 GMT 2014
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
More information about the Gcc
mailing list