diff mbox

Eliminate the .eh_frame sections from the aarch64 vmlinux and kernel modules

Message ID 1453434986-19307-1-git-send-email-wcohen@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

William Cohen Jan. 22, 2016, 3:56 a.m. UTC
By default the aarch64 gcc generates .eh_frame sections.  Unlike
.debug_frame sections, the .eh_frame sections are loaded into memory
when the associated code is loaded.  On an example kernel being built
with this default the .eh_frame section in vmlinux used an extra 1.7MB
of memory.  The x86 disables the creation of the .eh_frame section.
The aarch64 should probably do the same to save some memory.

Signed-off-by: William Cohen <wcohen@redhat.com>
---
 arch/arm64/Makefile | 1 +
 1 file changed, 1 insertion(+)

Comments

Ard Biesheuvel Jan. 22, 2016, 7:41 a.m. UTC | #1
On 22 January 2016 at 04:56, William Cohen <wcohen@redhat.com> wrote:
> By default the aarch64 gcc generates .eh_frame sections.  Unlike
> .debug_frame sections, the .eh_frame sections are loaded into memory
> when the associated code is loaded.  On an example kernel being built
> with this default the .eh_frame section in vmlinux used an extra 1.7MB
> of memory.  The x86 disables the creation of the .eh_frame section.
> The aarch64 should probably do the same to save some memory.
>

With my GCC-4.9.3 Linaro toolchain, I am not getting .eh_frame
sections only .debug_frame sections. The patch still makes sense imo,
but it appears to be redundant in some cases, and it would be useful
to figure out why. Which toolchain have you tested this with?


> Signed-off-by: William Cohen <wcohen@redhat.com>
> ---
>  arch/arm64/Makefile | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
> index cd822d8..094a137 100644
> --- a/arch/arm64/Makefile
> +++ b/arch/arm64/Makefile
> @@ -27,6 +27,7 @@ $(warning LSE atomics not supported by binutils)
>  endif
>
>  KBUILD_CFLAGS  += -mgeneral-regs-only $(lseinstr)
> +KBUILD_CFLAGS  += -fno-asynchronous-unwind-tables
>  KBUILD_AFLAGS  += $(lseinstr)
>
>  ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
> --
> 2.5.0
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
William Cohen Jan. 22, 2016, 2:43 p.m. UTC | #2
On 01/22/2016 02:41 AM, Ard Biesheuvel wrote:
> On 22 January 2016 at 04:56, William Cohen <wcohen@redhat.com> wrote:
>> By default the aarch64 gcc generates .eh_frame sections.  Unlike
>> .debug_frame sections, the .eh_frame sections are loaded into memory
>> when the associated code is loaded.  On an example kernel being built
>> with this default the .eh_frame section in vmlinux used an extra 1.7MB
>> of memory.  The x86 disables the creation of the .eh_frame section.
>> The aarch64 should probably do the same to save some memory.
>>
> 
> With my GCC-4.9.3 Linaro toolchain, I am not getting .eh_frame
> sections only .debug_frame sections. The patch still makes sense imo,
> but it appears to be redundant in some cases, and it would be useful
> to figure out why. Which toolchain have you tested this with?

Hi,

I have observed the .eh_frame being generated with gcc-5.3.1 that is in Fedora 23.

-Will

> 
> 
>> Signed-off-by: William Cohen <wcohen@redhat.com>
>> ---
>>  arch/arm64/Makefile | 1 +
>>  1 file changed, 1 insertion(+)
>>
>> diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
>> index cd822d8..094a137 100644
>> --- a/arch/arm64/Makefile
>> +++ b/arch/arm64/Makefile
>> @@ -27,6 +27,7 @@ $(warning LSE atomics not supported by binutils)
>>  endif
>>
>>  KBUILD_CFLAGS  += -mgeneral-regs-only $(lseinstr)
>> +KBUILD_CFLAGS  += -fno-asynchronous-unwind-tables
>>  KBUILD_AFLAGS  += $(lseinstr)
>>
>>  ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
>> --
>> 2.5.0
>>
>>
>> _______________________________________________
>> linux-arm-kernel mailing list
>> linux-arm-kernel@lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Mark Rutland Jan. 22, 2016, 3:02 p.m. UTC | #3
On Fri, Jan 22, 2016 at 09:43:25AM -0500, William Cohen wrote:
> On 01/22/2016 02:41 AM, Ard Biesheuvel wrote:
> > On 22 January 2016 at 04:56, William Cohen <wcohen@redhat.com> wrote:
> >> By default the aarch64 gcc generates .eh_frame sections.  Unlike
> >> .debug_frame sections, the .eh_frame sections are loaded into memory
> >> when the associated code is loaded.  On an example kernel being built
> >> with this default the .eh_frame section in vmlinux used an extra 1.7MB
> >> of memory.  The x86 disables the creation of the .eh_frame section.
> >> The aarch64 should probably do the same to save some memory.
> >>
> > 
> > With my GCC-4.9.3 Linaro toolchain, I am not getting .eh_frame
> > sections only .debug_frame sections. The patch still makes sense imo,
> > but it appears to be redundant in some cases, and it would be useful
> > to figure out why. Which toolchain have you tested this with?
> 
> Hi,
> 
> I have observed the .eh_frame being generated with gcc-5.3.1 that is in Fedora 23.

FWIW, I do not see this with the Linaro 15.08 GCC 5.1.1.

It would be interesting to know if that's something that changed
upstream between 5.1.x and 5.3.x or if that's a Fedora-specific
configuration option, but either way the patch seems reasonable.

Thanks,
Mark.
William Cohen Jan. 22, 2016, 3:36 p.m. UTC | #4
On 01/22/2016 10:02 AM, Mark Rutland wrote:
> On Fri, Jan 22, 2016 at 09:43:25AM -0500, William Cohen wrote:
>> On 01/22/2016 02:41 AM, Ard Biesheuvel wrote:
>>> On 22 January 2016 at 04:56, William Cohen <wcohen@redhat.com> wrote:
>>>> By default the aarch64 gcc generates .eh_frame sections.  Unlike
>>>> .debug_frame sections, the .eh_frame sections are loaded into memory
>>>> when the associated code is loaded.  On an example kernel being built
>>>> with this default the .eh_frame section in vmlinux used an extra 1.7MB
>>>> of memory.  The x86 disables the creation of the .eh_frame section.
>>>> The aarch64 should probably do the same to save some memory.
>>>>
>>>
>>> With my GCC-4.9.3 Linaro toolchain, I am not getting .eh_frame
>>> sections only .debug_frame sections. The patch still makes sense imo,
>>> but it appears to be redundant in some cases, and it would be useful
>>> to figure out why. Which toolchain have you tested this with?
>>
>> Hi,
>>
>> I have observed the .eh_frame being generated with gcc-5.3.1 that is in Fedora 23.
> 
> FWIW, I do not see this with the Linaro 15.08 GCC 5.1.1.
> 
> It would be interesting to know if that's something that changed
> upstream between 5.1.x and 5.3.x or if that's a Fedora-specific
> configuration option, but either way the patch seems reasonable.
> 
> Thanks,
> Mark.
> 

Hi Mark,

The sizes of the resulting vmlinux files are pretty similar. However, I could see the change in available memory when I booted the kernels. To see the change without booting you need to use eu-readelf.  The vmlinux.eh_frame is the original build and the vmlinux.no_eh_frame is the build with the -fno-asynchronous-unwind-tables.  The "LOAD" line of "eu-readelf -l" show MemSiz drop.  The "ue-readelf -S" output shows movement of the data moved from the .eh_frame to the .debug_frame section.  Below is the various eu-readelf output.

-Will

[linaro@localhost kernel]$ eu-readelf -l vmlinux.eh_frame 
Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  LOAD           0x010000 0xffffffc000080000 0xffffffc000080000 0xe33800 0x1b2a648 RWE 0x10000
  NOTE           0xd04a00 0xffffffc000d74a00 0xffffffc000d74a00 0x000024 0x000024 R   0x4
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10

 Section to Segment mapping:
  Segment Sections...
   00      .head.text .text .text.init .rodata .eh_frame .init.rodata.str1.8 .init.eh_frame __bug_table .pci_fixup __ksymtab __ksymtab_gpl __ksymtab_strings __param __modver __ex_table .notes .init.text .exit.text .init.data .data..percpu .altinstructions .altinstr_replacement .data .pecoff_edata_padding .bss
   01      .notes
   02     
[linaro@localhost kernel]$ eu-readelf -l vmlinux.no_eh_frame 
Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  LOAD           0x010000 0xffffffc000080000 0xffffffc000080000 0xc83800 0x197a648 RWE 0x10000
  NOTE           0xb53a00 0xffffffc000bc3a00 0xffffffc000bc3a00 0x000024 0x000024 R   0x4
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10

 Section to Segment mapping:
  Segment Sections...
   00      .head.text .text .text.init .rodata .init.rodata.str1.8 __bug_table .pci_fixup __ksymtab __ksymtab_gpl __ksymtab_strings __param __modver __ex_table .notes .init.text .exit.text .init.data .data..percpu .altinstructions .altinstr_replacement .data .pecoff_edata_padding .bss
   01      .notes
   02     

[linaro@localhost kernel]$ eu-readelf -S vmlinux.eh_frame 
There are 37 section headers, starting at offset 0x8b07650:

Section Headers:
[Nr] Name                 Type         Addr             Off      Size     ES Flags Lk Inf Al
[ 0]                      NULL         0000000000000000 00000000 00000000  0        0   0  0
[ 1] .head.text           PROGBITS     ffffffc000080000 00010000 00002000  0 AX     0   0 4096
[ 2] .text                PROGBITS     ffffffc000082000 00012000 00807890  0 AX     0   0 4096
[ 3] .text.init           PROGBITS     ffffffc000889890 00819890 00000090  0 AX     0   0 16
[ 4] .rodata              PROGBITS     ffffffc00088a000 0081a000 002d22a0  0 A      0   0 4096
[ 5] .eh_frame            PROGBITS     ffffffc000b5c2a0 00aec2a0 001b0960  0 A      0   0  8
[ 6] .init.rodata.str1.8  PROGBITS     ffffffc000d0cc00 00c9cc00 00000768  1 AMS    0   0  8
[ 7] .init.eh_frame       PROGBITS     ffffffc000d0d368 00c9d368 00000530  0 A      0   0  8
[ 8] __bug_table          PROGBITS     ffffffc000d0d898 00c9d898 000147b4  0 A      0   0  4
[ 9] .pci_fixup           PROGBITS     ffffffc000d22050 00cb2050 00002358  0 A      0   0  8
[10] __ksymtab            PROGBITS     ffffffc000d243a8 00cb43a8 00012360  0 A      0   0  8
[11] __ksymtab_gpl        PROGBITS     ffffffc000d36708 00cc6708 0000f610  0 A      0   0  8
[12] __ksymtab_strings    PROGBITS     ffffffc000d45d18 00cd5d18 00028fa4  0 A      0   0  1
[13] __param              PROGBITS     ffffffc000d6ecc0 00cfecc0 00002580  0 A      0   0  8
[14] __modver             PROGBITS     ffffffc000d71240 00d01240 00000dc0  0 A      0   0  8
[15] __ex_table           PROGBITS     ffffffc000d72000 00d02000 00002a00  0 A      0   0  8
[16] .notes               NOTE         ffffffc000d74a00 00d04a00 00000024  0 A      0   0  4
[17] .init.text           PROGBITS     ffffffc000d75000 00d05000 000394b8  0 AX     0   0 16
[18] .exit.text           PROGBITS     ffffffc000dae4b8 00d3e4b8 00002f20  0 AX     0   0  4
[19] .init.data           PROGBITS     ffffffc000db13e0 00d413e0 00045bd8  0 WA     0   0 32
[20] .data..percpu        PROGBITS     ffffffc000df7000 00d87000 00006cc0  0 WA     0   0 64
[21] .altinstructions     PROGBITS     ffffffc000dfe000 00d8e000 000091c8  0 A      0   0  1
[22] .altinstr_replacement PROGBITS     ffffffc000e071c8 00d971c8 00003098  0 AX     0   0  1
[23] .data                PROGBITS     ffffffc000e0b000 00d9b000 000a8668  0 WA     0   0 4096
[24] .pecoff_edata_padding PROGBITS     ffffffc000eb3668 00e43668 00000198  0 WA     0   0  1
[25] .bss                 NOBITS       ffffffc000eb4000 00e43800 00cf6648  0 WA     0   0 4096
[26] .comment             PROGBITS     0000000000000000 00e43800 0000002c  1 MS     0   0  1
[27] .debug_line          PROGBITS     0000000000000000 00e4382c 00645ee5  0        0   0  1
[28] .debug_info          PROGBITS     0000000000000000 01489711 05f6205d  0        0   0  1
[29] .debug_abbrev        PROGBITS     0000000000000000 073eb76e 00294bdc  0        0   0  1
[30] .debug_aranges       PROGBITS     0000000000000000 07680350 0001dfd0  0        0   0 16
[31] .debug_ranges        PROGBITS     0000000000000000 0769e320 0046a880  0        0   0 16
[32] .debug_str           PROGBITS     0000000000000000 07b08ba0 00223043  1 MS     0   0  1
[33] .debug_loc           PROGBITS     0000000000000000 07d2bbe3 00976164  0        0   0  1
[34] .shstrtab            STRTAB       0000000000000000 086a1d47 00000193  0        0   0  1
[35] .symtab              SYMTAB       0000000000000000 086a1ee0 002f4ba0 24       36 102756  8
[36] .strtab              STRTAB       0000000000000000 08996a80 00170bcc  0        0   0  1


[linaro@localhost kernel]$ eu-readelf -S vmlinux.no_eh_frame 
There are 36 section headers, starting at offset 0x8b3b950:

Section Headers:
[Nr] Name                 Type         Addr             Off      Size     ES Flags Lk Inf Al
[ 0]                      NULL         0000000000000000 00000000 00000000  0        0   0  0
[ 1] .head.text           PROGBITS     ffffffc000080000 00010000 00002000  0 AX     0   0 4096
[ 2] .text                PROGBITS     ffffffc000082000 00012000 00807890  0 AX     0   0 4096
[ 3] .text.init           PROGBITS     ffffffc000889890 00819890 00000090  0 AX     0   0 16
[ 4] .rodata              PROGBITS     ffffffc00088a000 0081a000 002d22a0  0 A      0   0 4096
[ 5] .init.rodata.str1.8  PROGBITS     ffffffc000b5c2a0 00aec2a0 00000768  1 AMS    0   0  8
[ 6] __bug_table          PROGBITS     ffffffc000b5ca08 00aeca08 000147b4  0 A      0   0  4
[ 7] .pci_fixup           PROGBITS     ffffffc000b711c0 00b011c0 00002358  0 A      0   0  8
[ 8] __ksymtab            PROGBITS     ffffffc000b73518 00b03518 00012360  0 A      0   0  8
[ 9] __ksymtab_gpl        PROGBITS     ffffffc000b85878 00b15878 0000f610  0 A      0   0  8
[10] __ksymtab_strings    PROGBITS     ffffffc000b94e88 00b24e88 00028fa4  0 A      0   0  1
[11] __param              PROGBITS     ffffffc000bbde30 00b4de30 00002580  0 A      0   0  8
[12] __modver             PROGBITS     ffffffc000bc03b0 00b503b0 00000c50  0 A      0   0  8
[13] __ex_table           PROGBITS     ffffffc000bc1000 00b51000 00002a00  0 A      0   0  8
[14] .notes               NOTE         ffffffc000bc3a00 00b53a00 00000024  0 A      0   0  4
[15] .init.text           PROGBITS     ffffffc000bc4000 00b54000 00039498  0 AX     0   0 16
[16] .exit.text           PROGBITS     ffffffc000bfd498 00b8d498 00002f20  0 AX     0   0  4
[17] .init.data           PROGBITS     ffffffc000c003c0 00b903c0 00045bd8  0 WA     0   0 32
[18] .data..percpu        PROGBITS     ffffffc000c46000 00bd6000 00006cc0  0 WA     0   0 64
[19] .altinstructions     PROGBITS     ffffffc000c4d000 00bdd000 000091c8  0 A      0   0  1
[20] .altinstr_replacement PROGBITS     ffffffc000c561c8 00be61c8 00003098  0 AX     0   0  1
[21] .data                PROGBITS     ffffffc000c5a000 00bea000 000a9668  0 WA     0   0 4096
[22] .pecoff_edata_padding PROGBITS     ffffffc000d03668 00c93668 00000198  0 WA     0   0  1
[23] .bss                 NOBITS       ffffffc000d04000 00c93800 00cf6648  0 WA     0   0 4096
[24] .comment             PROGBITS     0000000000000000 00c93800 0000002c  1 MS     0   0  1
[25] .debug_line          PROGBITS     0000000000000000 00c9382c 00646080  0        0   0  1
[26] .debug_info          PROGBITS     0000000000000000 012d98ac 05f61fab  0        0   0  1
[27] .debug_abbrev        PROGBITS     0000000000000000 0723b857 00294bd3  0        0   0  1
[28] .debug_aranges       PROGBITS     0000000000000000 074d0430 0001dfd0  0        0   0 16
[29] .debug_ranges        PROGBITS     0000000000000000 074ee400 0046ad10  0        0   0 16
[30] .debug_frame         PROGBITS     0000000000000000 07959110 001e35c8  0        0   0  8
[31] .debug_str           PROGBITS     0000000000000000 07b3c6d8 002230a2  1 MS     0   0  1
[32] .debug_loc           PROGBITS     0000000000000000 07d5f77a 009768ea  0        0   0  1
[33] .shstrtab            STRTAB       0000000000000000 086d6064 00000191  0        0   0  1
[34] .symtab              SYMTAB       0000000000000000 086d61f8 002f4b88 24       35 102755  8
[35] .strtab              STRTAB       0000000000000000 089cad80 00170bcc  0        0   0  1
Mark Rutland Jan. 22, 2016, 5:02 p.m. UTC | #5
On Fri, Jan 22, 2016 at 10:36:12AM -0500, William Cohen wrote:
> On 01/22/2016 10:02 AM, Mark Rutland wrote:
> > On Fri, Jan 22, 2016 at 09:43:25AM -0500, William Cohen wrote:
> >> On 01/22/2016 02:41 AM, Ard Biesheuvel wrote:
> >>> On 22 January 2016 at 04:56, William Cohen <wcohen@redhat.com> wrote:
> >>>> By default the aarch64 gcc generates .eh_frame sections.  Unlike
> >>>> .debug_frame sections, the .eh_frame sections are loaded into memory
> >>>> when the associated code is loaded.  On an example kernel being built
> >>>> with this default the .eh_frame section in vmlinux used an extra 1.7MB
> >>>> of memory.  The x86 disables the creation of the .eh_frame section.
> >>>> The aarch64 should probably do the same to save some memory.
> >>>>
> >>>
> >>> With my GCC-4.9.3 Linaro toolchain, I am not getting .eh_frame
> >>> sections only .debug_frame sections. The patch still makes sense imo,
> >>> but it appears to be redundant in some cases, and it would be useful
> >>> to figure out why. Which toolchain have you tested this with?
> >>
> >> Hi,
> >>
> >> I have observed the .eh_frame being generated with gcc-5.3.1 that is in Fedora 23.
> > 
> > FWIW, I do not see this with the Linaro 15.08 GCC 5.1.1.
> > 
> > It would be interesting to know if that's something that changed
> > upstream between 5.1.x and 5.3.x or if that's a Fedora-specific
> > configuration option, but either way the patch seems reasonable.
> > 
> > Thanks,
> > Mark.
> > 
> 
> Hi Mark,
> 
> The sizes of the resulting vmlinux files are pretty similar. However,
> I could see the change in available memory when I booted the kernels.
> To see the change without booting you need to use eu-readelf.

I was looking with the binutils readelf form the Linaro 15.08 toolchain.
Will that not show eh_frame for some reason?

Regardless, as I mentioned the patch seems fine regardless, the details
were mostly interesting for the commit message and curiosity.

> The vmlinux.eh_frame is the original build and the vmlinux.no_eh_frame
> is the build with the -fno-asynchronous-unwind-tables.  The "LOAD"
> line of "eu-readelf -l" show MemSiz drop.  The "ue-readelf -S" output
> shows movement of the data moved from the .eh_frame to the
> .debug_frame section.  Below is the various eu-readelf output.

Thanks for the info.

Mark.

> 
> -Will
> 
> [linaro@localhost kernel]$ eu-readelf -l vmlinux.eh_frame 
> Program Headers:
>   Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
>   LOAD           0x010000 0xffffffc000080000 0xffffffc000080000 0xe33800 0x1b2a648 RWE 0x10000
>   NOTE           0xd04a00 0xffffffc000d74a00 0xffffffc000d74a00 0x000024 0x000024 R   0x4
>   GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10
> 
>  Section to Segment mapping:
>   Segment Sections...
>    00      .head.text .text .text.init .rodata .eh_frame .init.rodata.str1.8 .init.eh_frame __bug_table .pci_fixup __ksymtab __ksymtab_gpl __ksymtab_strings __param __modver __ex_table .notes .init.text .exit.text .init.data .data..percpu .altinstructions .altinstr_replacement .data .pecoff_edata_padding .bss
>    01      .notes
>    02     
> [linaro@localhost kernel]$ eu-readelf -l vmlinux.no_eh_frame 
> Program Headers:
>   Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
>   LOAD           0x010000 0xffffffc000080000 0xffffffc000080000 0xc83800 0x197a648 RWE 0x10000
>   NOTE           0xb53a00 0xffffffc000bc3a00 0xffffffc000bc3a00 0x000024 0x000024 R   0x4
>   GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10
> 
>  Section to Segment mapping:
>   Segment Sections...
>    00      .head.text .text .text.init .rodata .init.rodata.str1.8 __bug_table .pci_fixup __ksymtab __ksymtab_gpl __ksymtab_strings __param __modver __ex_table .notes .init.text .exit.text .init.data .data..percpu .altinstructions .altinstr_replacement .data .pecoff_edata_padding .bss
>    01      .notes
>    02     
> 
> [linaro@localhost kernel]$ eu-readelf -S vmlinux.eh_frame 
> There are 37 section headers, starting at offset 0x8b07650:
> 
> Section Headers:
> [Nr] Name                 Type         Addr             Off      Size     ES Flags Lk Inf Al
> [ 0]                      NULL         0000000000000000 00000000 00000000  0        0   0  0
> [ 1] .head.text           PROGBITS     ffffffc000080000 00010000 00002000  0 AX     0   0 4096
> [ 2] .text                PROGBITS     ffffffc000082000 00012000 00807890  0 AX     0   0 4096
> [ 3] .text.init           PROGBITS     ffffffc000889890 00819890 00000090  0 AX     0   0 16
> [ 4] .rodata              PROGBITS     ffffffc00088a000 0081a000 002d22a0  0 A      0   0 4096
> [ 5] .eh_frame            PROGBITS     ffffffc000b5c2a0 00aec2a0 001b0960  0 A      0   0  8
> [ 6] .init.rodata.str1.8  PROGBITS     ffffffc000d0cc00 00c9cc00 00000768  1 AMS    0   0  8
> [ 7] .init.eh_frame       PROGBITS     ffffffc000d0d368 00c9d368 00000530  0 A      0   0  8
> [ 8] __bug_table          PROGBITS     ffffffc000d0d898 00c9d898 000147b4  0 A      0   0  4
> [ 9] .pci_fixup           PROGBITS     ffffffc000d22050 00cb2050 00002358  0 A      0   0  8
> [10] __ksymtab            PROGBITS     ffffffc000d243a8 00cb43a8 00012360  0 A      0   0  8
> [11] __ksymtab_gpl        PROGBITS     ffffffc000d36708 00cc6708 0000f610  0 A      0   0  8
> [12] __ksymtab_strings    PROGBITS     ffffffc000d45d18 00cd5d18 00028fa4  0 A      0   0  1
> [13] __param              PROGBITS     ffffffc000d6ecc0 00cfecc0 00002580  0 A      0   0  8
> [14] __modver             PROGBITS     ffffffc000d71240 00d01240 00000dc0  0 A      0   0  8
> [15] __ex_table           PROGBITS     ffffffc000d72000 00d02000 00002a00  0 A      0   0  8
> [16] .notes               NOTE         ffffffc000d74a00 00d04a00 00000024  0 A      0   0  4
> [17] .init.text           PROGBITS     ffffffc000d75000 00d05000 000394b8  0 AX     0   0 16
> [18] .exit.text           PROGBITS     ffffffc000dae4b8 00d3e4b8 00002f20  0 AX     0   0  4
> [19] .init.data           PROGBITS     ffffffc000db13e0 00d413e0 00045bd8  0 WA     0   0 32
> [20] .data..percpu        PROGBITS     ffffffc000df7000 00d87000 00006cc0  0 WA     0   0 64
> [21] .altinstructions     PROGBITS     ffffffc000dfe000 00d8e000 000091c8  0 A      0   0  1
> [22] .altinstr_replacement PROGBITS     ffffffc000e071c8 00d971c8 00003098  0 AX     0   0  1
> [23] .data                PROGBITS     ffffffc000e0b000 00d9b000 000a8668  0 WA     0   0 4096
> [24] .pecoff_edata_padding PROGBITS     ffffffc000eb3668 00e43668 00000198  0 WA     0   0  1
> [25] .bss                 NOBITS       ffffffc000eb4000 00e43800 00cf6648  0 WA     0   0 4096
> [26] .comment             PROGBITS     0000000000000000 00e43800 0000002c  1 MS     0   0  1
> [27] .debug_line          PROGBITS     0000000000000000 00e4382c 00645ee5  0        0   0  1
> [28] .debug_info          PROGBITS     0000000000000000 01489711 05f6205d  0        0   0  1
> [29] .debug_abbrev        PROGBITS     0000000000000000 073eb76e 00294bdc  0        0   0  1
> [30] .debug_aranges       PROGBITS     0000000000000000 07680350 0001dfd0  0        0   0 16
> [31] .debug_ranges        PROGBITS     0000000000000000 0769e320 0046a880  0        0   0 16
> [32] .debug_str           PROGBITS     0000000000000000 07b08ba0 00223043  1 MS     0   0  1
> [33] .debug_loc           PROGBITS     0000000000000000 07d2bbe3 00976164  0        0   0  1
> [34] .shstrtab            STRTAB       0000000000000000 086a1d47 00000193  0        0   0  1
> [35] .symtab              SYMTAB       0000000000000000 086a1ee0 002f4ba0 24       36 102756  8
> [36] .strtab              STRTAB       0000000000000000 08996a80 00170bcc  0        0   0  1
> 
> 
> [linaro@localhost kernel]$ eu-readelf -S vmlinux.no_eh_frame 
> There are 36 section headers, starting at offset 0x8b3b950:
> 
> Section Headers:
> [Nr] Name                 Type         Addr             Off      Size     ES Flags Lk Inf Al
> [ 0]                      NULL         0000000000000000 00000000 00000000  0        0   0  0
> [ 1] .head.text           PROGBITS     ffffffc000080000 00010000 00002000  0 AX     0   0 4096
> [ 2] .text                PROGBITS     ffffffc000082000 00012000 00807890  0 AX     0   0 4096
> [ 3] .text.init           PROGBITS     ffffffc000889890 00819890 00000090  0 AX     0   0 16
> [ 4] .rodata              PROGBITS     ffffffc00088a000 0081a000 002d22a0  0 A      0   0 4096
> [ 5] .init.rodata.str1.8  PROGBITS     ffffffc000b5c2a0 00aec2a0 00000768  1 AMS    0   0  8
> [ 6] __bug_table          PROGBITS     ffffffc000b5ca08 00aeca08 000147b4  0 A      0   0  4
> [ 7] .pci_fixup           PROGBITS     ffffffc000b711c0 00b011c0 00002358  0 A      0   0  8
> [ 8] __ksymtab            PROGBITS     ffffffc000b73518 00b03518 00012360  0 A      0   0  8
> [ 9] __ksymtab_gpl        PROGBITS     ffffffc000b85878 00b15878 0000f610  0 A      0   0  8
> [10] __ksymtab_strings    PROGBITS     ffffffc000b94e88 00b24e88 00028fa4  0 A      0   0  1
> [11] __param              PROGBITS     ffffffc000bbde30 00b4de30 00002580  0 A      0   0  8
> [12] __modver             PROGBITS     ffffffc000bc03b0 00b503b0 00000c50  0 A      0   0  8
> [13] __ex_table           PROGBITS     ffffffc000bc1000 00b51000 00002a00  0 A      0   0  8
> [14] .notes               NOTE         ffffffc000bc3a00 00b53a00 00000024  0 A      0   0  4
> [15] .init.text           PROGBITS     ffffffc000bc4000 00b54000 00039498  0 AX     0   0 16
> [16] .exit.text           PROGBITS     ffffffc000bfd498 00b8d498 00002f20  0 AX     0   0  4
> [17] .init.data           PROGBITS     ffffffc000c003c0 00b903c0 00045bd8  0 WA     0   0 32
> [18] .data..percpu        PROGBITS     ffffffc000c46000 00bd6000 00006cc0  0 WA     0   0 64
> [19] .altinstructions     PROGBITS     ffffffc000c4d000 00bdd000 000091c8  0 A      0   0  1
> [20] .altinstr_replacement PROGBITS     ffffffc000c561c8 00be61c8 00003098  0 AX     0   0  1
> [21] .data                PROGBITS     ffffffc000c5a000 00bea000 000a9668  0 WA     0   0 4096
> [22] .pecoff_edata_padding PROGBITS     ffffffc000d03668 00c93668 00000198  0 WA     0   0  1
> [23] .bss                 NOBITS       ffffffc000d04000 00c93800 00cf6648  0 WA     0   0 4096
> [24] .comment             PROGBITS     0000000000000000 00c93800 0000002c  1 MS     0   0  1
> [25] .debug_line          PROGBITS     0000000000000000 00c9382c 00646080  0        0   0  1
> [26] .debug_info          PROGBITS     0000000000000000 012d98ac 05f61fab  0        0   0  1
> [27] .debug_abbrev        PROGBITS     0000000000000000 0723b857 00294bd3  0        0   0  1
> [28] .debug_aranges       PROGBITS     0000000000000000 074d0430 0001dfd0  0        0   0 16
> [29] .debug_ranges        PROGBITS     0000000000000000 074ee400 0046ad10  0        0   0 16
> [30] .debug_frame         PROGBITS     0000000000000000 07959110 001e35c8  0        0   0  8
> [31] .debug_str           PROGBITS     0000000000000000 07b3c6d8 002230a2  1 MS     0   0  1
> [32] .debug_loc           PROGBITS     0000000000000000 07d5f77a 009768ea  0        0   0  1
> [33] .shstrtab            STRTAB       0000000000000000 086d6064 00000191  0        0   0  1
> [34] .symtab              SYMTAB       0000000000000000 086d61f8 002f4b88 24       35 102755  8
> [35] .strtab              STRTAB       0000000000000000 089cad80 00170bcc  0        0   0  1
> 
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
William Cohen Jan. 22, 2016, 7:03 p.m. UTC | #6
On 01/22/2016 12:02 PM, Mark Rutland wrote:
> On Fri, Jan 22, 2016 at 10:36:12AM -0500, William Cohen wrote:
>> On 01/22/2016 10:02 AM, Mark Rutland wrote:
>>> On Fri, Jan 22, 2016 at 09:43:25AM -0500, William Cohen wrote:
>>>> On 01/22/2016 02:41 AM, Ard Biesheuvel wrote:
>>>>> On 22 January 2016 at 04:56, William Cohen <wcohen@redhat.com> wrote:
>>>>>> By default the aarch64 gcc generates .eh_frame sections.  Unlike
>>>>>> .debug_frame sections, the .eh_frame sections are loaded into memory
>>>>>> when the associated code is loaded.  On an example kernel being built
>>>>>> with this default the .eh_frame section in vmlinux used an extra 1.7MB
>>>>>> of memory.  The x86 disables the creation of the .eh_frame section.
>>>>>> The aarch64 should probably do the same to save some memory.
>>>>>>
>>>>>
>>>>> With my GCC-4.9.3 Linaro toolchain, I am not getting .eh_frame
>>>>> sections only .debug_frame sections. The patch still makes sense imo,
>>>>> but it appears to be redundant in some cases, and it would be useful
>>>>> to figure out why. Which toolchain have you tested this with?
>>>>
>>>> Hi,
>>>>
>>>> I have observed the .eh_frame being generated with gcc-5.3.1 that is in Fedora 23.
>>>
>>> FWIW, I do not see this with the Linaro 15.08 GCC 5.1.1.
>>>
>>> It would be interesting to know if that's something that changed
>>> upstream between 5.1.x and 5.3.x or if that's a Fedora-specific
>>> configuration option, but either way the patch seems reasonable.
>>>
>>> Thanks,
>>> Mark.
>>>
>>
>> Hi Mark,
>>
>> The sizes of the resulting vmlinux files are pretty similar. However,
>> I could see the change in available memory when I booted the kernels.
>> To see the change without booting you need to use eu-readelf.
> 
> I was looking with the binutils readelf form the Linaro 15.08 toolchain.
> Will that not show eh_frame for some reason?

Hi Mark,

eu-readelf was used because it was handy. On fedora 23 the binutils readelf gives similar information. I would expect it to do the same for the Linaro 15.08 toolchain.

> 
> Regardless, as I mentioned the patch seems fine regardless, the details
> were mostly interesting for the commit message and curiosity.

Looking through the fedora gcc srpm I did find a patch that turns on the asynchronouns_unwind_tables by default, gcc5-aarch64-async-unw-tables.patch. The history of checkins for Fedora gcc srpm shows it was added 2014-07-16.  However, I don't see it in the upstream gcc. That would explain the difference in behavior between Fedora and Linaro.  The patch itself turns on eh_frame support so that exception handling still works for user-space code even when frame pointers are disabled.

-Will
> 
>> The vmlinux.eh_frame is the original build and the vmlinux.no_eh_frame
>> is the build with the -fno-asynchronous-unwind-tables.  The "LOAD"
>> line of "eu-readelf -l" show MemSiz drop.  The "ue-readelf -S" output
>> shows movement of the data moved from the .eh_frame to the
>> .debug_frame section.  Below is the various eu-readelf output.
> 
> Thanks for the info.
> 
> Mark.
> 
>>
>> -Will
>>
>> [linaro@localhost kernel]$ eu-readelf -l vmlinux.eh_frame 
>> Program Headers:
>>   Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
>>   LOAD           0x010000 0xffffffc000080000 0xffffffc000080000 0xe33800 0x1b2a648 RWE 0x10000
>>   NOTE           0xd04a00 0xffffffc000d74a00 0xffffffc000d74a00 0x000024 0x000024 R   0x4
>>   GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10
>>
>>  Section to Segment mapping:
>>   Segment Sections...
>>    00      .head.text .text .text.init .rodata .eh_frame .init.rodata.str1.8 .init.eh_frame __bug_table .pci_fixup __ksymtab __ksymtab_gpl __ksymtab_strings __param __modver __ex_table .notes .init.text .exit.text .init.data .data..percpu .altinstructions .altinstr_replacement .data .pecoff_edata_padding .bss
>>    01      .notes
>>    02     
>> [linaro@localhost kernel]$ eu-readelf -l vmlinux.no_eh_frame 
>> Program Headers:
>>   Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
>>   LOAD           0x010000 0xffffffc000080000 0xffffffc000080000 0xc83800 0x197a648 RWE 0x10000
>>   NOTE           0xb53a00 0xffffffc000bc3a00 0xffffffc000bc3a00 0x000024 0x000024 R   0x4
>>   GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10
>>
>>  Section to Segment mapping:
>>   Segment Sections...
>>    00      .head.text .text .text.init .rodata .init.rodata.str1.8 __bug_table .pci_fixup __ksymtab __ksymtab_gpl __ksymtab_strings __param __modver __ex_table .notes .init.text .exit.text .init.data .data..percpu .altinstructions .altinstr_replacement .data .pecoff_edata_padding .bss
>>    01      .notes
>>    02     
>>
>> [linaro@localhost kernel]$ eu-readelf -S vmlinux.eh_frame 
>> There are 37 section headers, starting at offset 0x8b07650:
>>
>> Section Headers:
>> [Nr] Name                 Type         Addr             Off      Size     ES Flags Lk Inf Al
>> [ 0]                      NULL         0000000000000000 00000000 00000000  0        0   0  0
>> [ 1] .head.text           PROGBITS     ffffffc000080000 00010000 00002000  0 AX     0   0 4096
>> [ 2] .text                PROGBITS     ffffffc000082000 00012000 00807890  0 AX     0   0 4096
>> [ 3] .text.init           PROGBITS     ffffffc000889890 00819890 00000090  0 AX     0   0 16
>> [ 4] .rodata              PROGBITS     ffffffc00088a000 0081a000 002d22a0  0 A      0   0 4096
>> [ 5] .eh_frame            PROGBITS     ffffffc000b5c2a0 00aec2a0 001b0960  0 A      0   0  8
>> [ 6] .init.rodata.str1.8  PROGBITS     ffffffc000d0cc00 00c9cc00 00000768  1 AMS    0   0  8
>> [ 7] .init.eh_frame       PROGBITS     ffffffc000d0d368 00c9d368 00000530  0 A      0   0  8
>> [ 8] __bug_table          PROGBITS     ffffffc000d0d898 00c9d898 000147b4  0 A      0   0  4
>> [ 9] .pci_fixup           PROGBITS     ffffffc000d22050 00cb2050 00002358  0 A      0   0  8
>> [10] __ksymtab            PROGBITS     ffffffc000d243a8 00cb43a8 00012360  0 A      0   0  8
>> [11] __ksymtab_gpl        PROGBITS     ffffffc000d36708 00cc6708 0000f610  0 A      0   0  8
>> [12] __ksymtab_strings    PROGBITS     ffffffc000d45d18 00cd5d18 00028fa4  0 A      0   0  1
>> [13] __param              PROGBITS     ffffffc000d6ecc0 00cfecc0 00002580  0 A      0   0  8
>> [14] __modver             PROGBITS     ffffffc000d71240 00d01240 00000dc0  0 A      0   0  8
>> [15] __ex_table           PROGBITS     ffffffc000d72000 00d02000 00002a00  0 A      0   0  8
>> [16] .notes               NOTE         ffffffc000d74a00 00d04a00 00000024  0 A      0   0  4
>> [17] .init.text           PROGBITS     ffffffc000d75000 00d05000 000394b8  0 AX     0   0 16
>> [18] .exit.text           PROGBITS     ffffffc000dae4b8 00d3e4b8 00002f20  0 AX     0   0  4
>> [19] .init.data           PROGBITS     ffffffc000db13e0 00d413e0 00045bd8  0 WA     0   0 32
>> [20] .data..percpu        PROGBITS     ffffffc000df7000 00d87000 00006cc0  0 WA     0   0 64
>> [21] .altinstructions     PROGBITS     ffffffc000dfe000 00d8e000 000091c8  0 A      0   0  1
>> [22] .altinstr_replacement PROGBITS     ffffffc000e071c8 00d971c8 00003098  0 AX     0   0  1
>> [23] .data                PROGBITS     ffffffc000e0b000 00d9b000 000a8668  0 WA     0   0 4096
>> [24] .pecoff_edata_padding PROGBITS     ffffffc000eb3668 00e43668 00000198  0 WA     0   0  1
>> [25] .bss                 NOBITS       ffffffc000eb4000 00e43800 00cf6648  0 WA     0   0 4096
>> [26] .comment             PROGBITS     0000000000000000 00e43800 0000002c  1 MS     0   0  1
>> [27] .debug_line          PROGBITS     0000000000000000 00e4382c 00645ee5  0        0   0  1
>> [28] .debug_info          PROGBITS     0000000000000000 01489711 05f6205d  0        0   0  1
>> [29] .debug_abbrev        PROGBITS     0000000000000000 073eb76e 00294bdc  0        0   0  1
>> [30] .debug_aranges       PROGBITS     0000000000000000 07680350 0001dfd0  0        0   0 16
>> [31] .debug_ranges        PROGBITS     0000000000000000 0769e320 0046a880  0        0   0 16
>> [32] .debug_str           PROGBITS     0000000000000000 07b08ba0 00223043  1 MS     0   0  1
>> [33] .debug_loc           PROGBITS     0000000000000000 07d2bbe3 00976164  0        0   0  1
>> [34] .shstrtab            STRTAB       0000000000000000 086a1d47 00000193  0        0   0  1
>> [35] .symtab              SYMTAB       0000000000000000 086a1ee0 002f4ba0 24       36 102756  8
>> [36] .strtab              STRTAB       0000000000000000 08996a80 00170bcc  0        0   0  1
>>
>>
>> [linaro@localhost kernel]$ eu-readelf -S vmlinux.no_eh_frame 
>> There are 36 section headers, starting at offset 0x8b3b950:
>>
>> Section Headers:
>> [Nr] Name                 Type         Addr             Off      Size     ES Flags Lk Inf Al
>> [ 0]                      NULL         0000000000000000 00000000 00000000  0        0   0  0
>> [ 1] .head.text           PROGBITS     ffffffc000080000 00010000 00002000  0 AX     0   0 4096
>> [ 2] .text                PROGBITS     ffffffc000082000 00012000 00807890  0 AX     0   0 4096
>> [ 3] .text.init           PROGBITS     ffffffc000889890 00819890 00000090  0 AX     0   0 16
>> [ 4] .rodata              PROGBITS     ffffffc00088a000 0081a000 002d22a0  0 A      0   0 4096
>> [ 5] .init.rodata.str1.8  PROGBITS     ffffffc000b5c2a0 00aec2a0 00000768  1 AMS    0   0  8
>> [ 6] __bug_table          PROGBITS     ffffffc000b5ca08 00aeca08 000147b4  0 A      0   0  4
>> [ 7] .pci_fixup           PROGBITS     ffffffc000b711c0 00b011c0 00002358  0 A      0   0  8
>> [ 8] __ksymtab            PROGBITS     ffffffc000b73518 00b03518 00012360  0 A      0   0  8
>> [ 9] __ksymtab_gpl        PROGBITS     ffffffc000b85878 00b15878 0000f610  0 A      0   0  8
>> [10] __ksymtab_strings    PROGBITS     ffffffc000b94e88 00b24e88 00028fa4  0 A      0   0  1
>> [11] __param              PROGBITS     ffffffc000bbde30 00b4de30 00002580  0 A      0   0  8
>> [12] __modver             PROGBITS     ffffffc000bc03b0 00b503b0 00000c50  0 A      0   0  8
>> [13] __ex_table           PROGBITS     ffffffc000bc1000 00b51000 00002a00  0 A      0   0  8
>> [14] .notes               NOTE         ffffffc000bc3a00 00b53a00 00000024  0 A      0   0  4
>> [15] .init.text           PROGBITS     ffffffc000bc4000 00b54000 00039498  0 AX     0   0 16
>> [16] .exit.text           PROGBITS     ffffffc000bfd498 00b8d498 00002f20  0 AX     0   0  4
>> [17] .init.data           PROGBITS     ffffffc000c003c0 00b903c0 00045bd8  0 WA     0   0 32
>> [18] .data..percpu        PROGBITS     ffffffc000c46000 00bd6000 00006cc0  0 WA     0   0 64
>> [19] .altinstructions     PROGBITS     ffffffc000c4d000 00bdd000 000091c8  0 A      0   0  1
>> [20] .altinstr_replacement PROGBITS     ffffffc000c561c8 00be61c8 00003098  0 AX     0   0  1
>> [21] .data                PROGBITS     ffffffc000c5a000 00bea000 000a9668  0 WA     0   0 4096
>> [22] .pecoff_edata_padding PROGBITS     ffffffc000d03668 00c93668 00000198  0 WA     0   0  1
>> [23] .bss                 NOBITS       ffffffc000d04000 00c93800 00cf6648  0 WA     0   0 4096
>> [24] .comment             PROGBITS     0000000000000000 00c93800 0000002c  1 MS     0   0  1
>> [25] .debug_line          PROGBITS     0000000000000000 00c9382c 00646080  0        0   0  1
>> [26] .debug_info          PROGBITS     0000000000000000 012d98ac 05f61fab  0        0   0  1
>> [27] .debug_abbrev        PROGBITS     0000000000000000 0723b857 00294bd3  0        0   0  1
>> [28] .debug_aranges       PROGBITS     0000000000000000 074d0430 0001dfd0  0        0   0 16
>> [29] .debug_ranges        PROGBITS     0000000000000000 074ee400 0046ad10  0        0   0 16
>> [30] .debug_frame         PROGBITS     0000000000000000 07959110 001e35c8  0        0   0  8
>> [31] .debug_str           PROGBITS     0000000000000000 07b3c6d8 002230a2  1 MS     0   0  1
>> [32] .debug_loc           PROGBITS     0000000000000000 07d5f77a 009768ea  0        0   0  1
>> [33] .shstrtab            STRTAB       0000000000000000 086d6064 00000191  0        0   0  1
>> [34] .symtab              SYMTAB       0000000000000000 086d61f8 002f4b88 24       35 102755  8
>> [35] .strtab              STRTAB       0000000000000000 089cad80 00170bcc  0        0   0  1
>>
>>
>>
>> _______________________________________________
>> linux-arm-kernel mailing list
>> linux-arm-kernel@lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>>
diff mbox

Patch

diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index cd822d8..094a137 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -27,6 +27,7 @@  $(warning LSE atomics not supported by binutils)
 endif
 
 KBUILD_CFLAGS	+= -mgeneral-regs-only $(lseinstr)
+KBUILD_CFLAGS	+= -fno-asynchronous-unwind-tables
 KBUILD_AFLAGS	+= $(lseinstr)
 
 ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)