[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v4 03/19] x86/boot: create *.lnk files with linker script



>>> On 06.08.16 at 01:04, <daniel.kiper@xxxxxxxxxx> wrote:
> Newer GCC (e.g. gcc version 5.1.1 20150618 (Red Hat 5.1.1-4) (GCC)) does
> some code optimizations by creating data sections (e.g. jump addresses
> for C switch/case are calculated using data in .rodata section). This
> thing is not accepted by *.lnk build recipe which requires that only .text
> section lives in output. Potentially we can inhibit this GCC behavior by
> using special options, e.g. -fno-tree-switch-conversion. However, this
> does not guarantee that in the future new similar optimizations or anything
> else which creates not accepted sections will not break our build recipes
> again. I do not mention that probably this is not good idea to just disable
> random optimizations. So, take over full control on *.lnk linking process
> by using linker script and merge required text and data sections into one
> .text section.
> 
> Additionally, remove .got.plt section which is not used in our final code.
> 
> Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
> ---
> v4 - suggestions/fixes:
>    - remove my name from copyright (Oracle requirement)
>      (suggested by Konrad Rzeszutek Wilk),
>    - improve comments,
>      (suggested by Jan Beulich),
>    - improve commit message
>      (suggested by Jan Beulich).
> ---
>  xen/arch/x86/boot/build32.lds |   51 
> +++++++++++++++++++++++++++++++++++++++++
>  xen/arch/x86/boot/build32.mk  |   10 +++++---
>  2 files changed, 58 insertions(+), 3 deletions(-)
>  create mode 100644 xen/arch/x86/boot/build32.lds
> 
> diff --git a/xen/arch/x86/boot/build32.lds b/xen/arch/x86/boot/build32.lds
> new file mode 100644
> index 0000000..b14c7d5
> --- /dev/null
> +++ b/xen/arch/x86/boot/build32.lds
> @@ -0,0 +1,51 @@
> +/*
> + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +ENTRY(_start)
> +
> +SECTIONS
> +{
> +  /* Merge code and data into one section. */
> +  .text : {
> +        *(.text)
> +        *(.text.*)
> +        *(.rodata)
> +  }

*(.rodata.*) ?

How about any other sections? Following the much improved
(thanks!) description, we can't exclude their appearance.

> +  /DISCARD/ : {
> +        /*
> +         * PIC/PIE executable contains .got.plt section even
> +         * if it is not linked with dynamic libraries. In such
> +         * case it is just placeholder for _GLOBAL_OFFSET_TABLE_
> +         * symbol and .PLT0. .PLT0 is filled by dynamic linker
> +         * and our code is not supposed to be loaded by dynamic
> +         * linker. So, from our point of view .PLT0 is unused.
> +         * This means that there is pretty good chance that
> +         * we can safely drop .got.plt as a whole here. Sadly
> +         * this is not true. _GLOBAL_OFFSET_TABLE_ is used as
> +         * a reference for relative addressing (and only for
> +         * that thing) and ld complains if we remove .got.plt
> +         * section here because it cannot find required symbol.
> +         * However, _GLOBAL_OFFSET_TABLE_ is no longer needed
> +         * in final output. So, drop .got.plt section during
> +         * conversion to plain binary format.

Commonly we have a problem the other way around; here I'd like
to ask that you don't break lines this early (often hardly going
meaningfully beyond 60 columns).

> --- a/xen/arch/x86/boot/build32.mk
> +++ b/xen/arch/x86/boot/build32.mk
> @@ -12,20 +12,24 @@ CFLAGS := $(filter-out -flto,$(CFLAGS))
>       (od -v -t x $< | tr -s ' ' | awk 'NR > 1 {print s} {s=$$0}' | \
>       sed 's/ /,0x/g' | sed 's/,0x$$//' | sed 's/^[0-9]*,/ .long /') >$@
>  
> +#
> +# Drop .got.plt during conversion to plain binary format.
> +# Please check build32.lds for more details.
> +#
>  %.bin: %.lnk

Please avoid the two blank comment lines.

> -     $(OBJCOPY) -O binary $< $@
> +     $(OBJCOPY) -O binary -R .got.plt $< $@
>  
>  %.lnk: %.o
>       $(OBJDUMP) -h $< | sed -n '/[0-9]/{s,00*,0,g;p;}' |\
>               while read idx name sz rest; do \
>                       case "$$name" in \
> -                     .data|.data.*|.rodata|.rodata.*|.bss|.bss.*) \
> +                     .data|.data.*|.rodata.*|.bss|.bss.*) \
>                               test $$sz != 0 || continue; \
>                               echo "Error: non-empty $$name: 0x$$sz" >&2; \
>                               exit $$(expr $$idx + 1);; \
>                       esac; \
>               done

This logic largely contradicts the use of a linker script: I'd much
rather see you include all the sections checked to be empty
here, and instead add a check that .got.plt (which you now
mean to drop) is of the expected size. Of course such a check
would need to go into the other rule's commands.

Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.