Linker script, start address of "subsection" and alignment
Mike Hommey
mh@glandium.org
Tue Jun 26 04:20:00 GMT 2018
Hi,
Consider the following C source:
```
__attribute__((aligned(32), section(".foo")))
long foo = 0;
```
And the following linker script:
```
SECTIONS {
.data : {
__foo = .;
*(.foo)
}
}
```
The goal being to have the `__foo` symbol point at the first thing that
was originally in the `.foo` section.
But this doesn't actually work because of the alignment. That is, `__foo`
gets its value pre-alignment. This is what -print-map says about .data:
```
.data 0x0000000000201020 0x28
*(.data .data.* .gnu.linkonce.d.*)
.data 0x0000000000201020 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o
.data 0x0000000000201020 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o
.data.rel.local
0x0000000000201020 0x8 /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o
0x0000000000201020 __dso_handle
.data 0x0000000000201028 0x0 /tmp/ccEGZYAm.o
.data 0x0000000000201028 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o
.data 0x0000000000201028 0x0 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o
0x0000000000201028 __foo = .
*(.foo)
*fill* 0x0000000000201028 0x18
.foo 0x0000000000201040 0x8 /tmp/ccEGZYAm.o
0x0000000000201040 foo
```
It is somehow possible to align by adding the following before the
symbol assignment in the linker script:
```
. = ALIGN(32)
```
but that doesn't seem very satisfactory. ALIGNOF doesn't allow to get
the alignment requirement from some input. Am I missing something or
is it not possible to do this "generically"?
Mike
More information about the Binutils
mailing list