Message ID | 1470038497-2536-6-git-send-email-ard.biesheuvel@linaro.org |
---|---|
State | New |
Headers | show |
On Mon, Aug 01, 2016 at 10:01:34AM +0200, Ard Biesheuvel wrote: > GCC in LTO mode interoperates poorly with non-standard libraries that > provide implementations of compiler intrinsics such as memcpy/memset > or the stack protector entry points. Such libraries need to be built > in non-LTO mode, and then referenced explicitly on the linker command > line using a -plugin-opt=-pass-through=-lxxx linker option. > > However, if these intrinsics are also referenced directly, the LTO > version of the code will be pulled in, and will happily satisfy all > other references to the same symbol. > > So add a pair of glue libraries, for ARM and AARCH64, that reference > the known intrinsics. Since the binaries live under ArmPkg directly, > we can reference them in tools_def.txt. Under LD garbage collection, > the object itself will be pruned, and so will the intrinsics that end > up unused by the module. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Acked-by: Jordan Justen <jordan.l.justen@intel.com> If everyone else is happy about this binary file inclusion, I certainly don't object (given that the source is included). Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> > --- > ArmPkg/Library/GccLto/liblto-aarch64.a | Bin 0 -> 1016 bytes > ArmPkg/Library/GccLto/liblto-aarch64.s | 27 +++++++++ > ArmPkg/Library/GccLto/liblto-arm.a | Bin 0 -> 2096 bytes > ArmPkg/Library/GccLto/liblto-arm.s | 61 ++++++++++++++++++++ > 4 files changed, 88 insertions(+) > > diff --git a/ArmPkg/Library/GccLto/liblto-aarch64.a b/ArmPkg/Library/GccLto/liblto-aarch64.a > new file mode 100644 > index 0000000000000000000000000000000000000000..2ab00238f0dad882abf08a1fb9623c9cdea9f17b > GIT binary patch > literal 1016 > zcmbu7&rZTX5XPqz6oLo!M8btcV>pmaJb3R#Pab@Ovb0qUG$GwJk&}<*)yMErJh~su > zhGA(FBh#ci^V@G{X8(NLKR&dgh`dGgNxR5Xq8|a14Nj;_ot@whUR;}*D0W|+#ne8) > z+crcqtbp?TKuy$d;Fk^js)5sWPGwPMt2G8wSV~i4b+$;e`67MRugg8~@}{d?w$pJf > z%hU2Z13wYMF8ko8f}aWQH5;VNy0m&m%Ghc<&b?O^ORa42Zb{|ZYEm;}M9QPwkz0*h > zki8>ef}gYSE})e*bOFvFk<j^57EYNXKak(^fcXvc@Z~)5d^m*lCr*Hz|6PAkvlcbK > oxX>*EVPSp5Eivz1-~TrQyaBwMaQ{8W!rrlD%!Td{2n*}~0;u;a`v3p{ > > literal 0 > HcmV?d00001 > > diff --git a/ArmPkg/Library/GccLto/liblto-aarch64.s b/ArmPkg/Library/GccLto/liblto-aarch64.s > new file mode 100644 > index 000000000000..45000d327758 > --- /dev/null > +++ b/ArmPkg/Library/GccLto/liblto-aarch64.s > @@ -0,0 +1,27 @@ > +// > +// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > +// > +// This program and the accompanying materials are licensed and made available under > +// the terms and conditions of the BSD License that accompanies this distribution. > +// The full text of the license may be found at > +// http://opensource.org/licenses/bsd-license.php. > +// > +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > +// > + > +// > +// GCC in LTO mode interoperates poorly with non-standard libraries that > +// provide implementations of compiler intrinsics such as memcpy/memset > +// or the stack protector entry points. > +// > +// By referencing these functions from a non-LTO object that can be passed > +// to the linker via the -plugin-opt=-pass-through=-lxxx options, the > +// intrinsics are included in the link in a way that allows them to be > +// pruned again if no other references to them exist. > +// > + > + .long memcpy - . > + .long memset - . > + .long __stack_chk_fail - . > + .long __stack_chk_guard - . > diff --git a/ArmPkg/Library/GccLto/liblto-arm.a b/ArmPkg/Library/GccLto/liblto-arm.a > new file mode 100644 > index 0000000000000000000000000000000000000000..d811c09573a35ea87a8002ecf01be18e1c6e7fd3 > GIT binary patch > literal 2096 > zcmd6o%WKq76vn?XQ*C|Js#WW|YOD1@u(oJH7cHm=wjd(Xg%C3{sS}#eGD-SEunQLz > zT?o1mx)E36&V>ti;!4n^e}Mi6u3h<^n@J{fT<Fp}Ouq9w_nvbfNlqSKoxD~mm5{X( > zhR`D5^G4ItF=}K8T}U0-`2R^Kc5yYX=T>}_x@dNmx{6!*W2si#P63O*VzW?IBihqh > z=)ig*pojKb#bw326`xc*toV}R>x!op&nRA0ysG%I;^&HAD}JZ=gW^w$zbO8u_=n=3 > zihn6C7jA)^cemm`#e<4%#TOM%D88Zij$&7Fpm;^`6UFO_-zdgF4UQAVZgtkF)@Pj= > z*ALnp_Y=1vL)@s|sQDwQ6*Mh*7aYIlFNiybaLxo6PTG16rQHlllhBAv-k>#u2@Sol > zI=`G}CPrQiN;tRR(ak(*AdNItn6xb{AamTrttlr6972!~lYGJ?&mg`uh4`8leFjDu > zR1H=l|GXG+(@3h}e9gF`ML(|A$Jm)#Ny{9*kb6fYIz6K#U~GZXiE;<`AQQJZh#Ex* > zvPafpsg(EM+QeEU%F9+!7AJXjt<6BM=oX+)l${4fw*md4-N1n8cCac_8FW^32XIbw > zCm?m%V%-}PWwOhnEHdMwdw?sVdjY8%7AKh$-3Qzh-4EOrJpf1@u{il%(L=yJ(ZfJZ > z^axNF?FRzUqrklAF(4K_4lIdsu@6KCfmP8Hz#~x>xiwL4;;HB<;F;)Y;DzWJUhHT& > zjNJ+~ZlqeztcDlZv9}b%uDP)byAnmP`PA5M95?(*5_=I7{9EHzOij<eVx#1jh0yHv > z<B{-Nm!6|^Pj~Rl*~wdJ;>*-d{<&4d*_Y!hx!AINvPBvHw{hmarpIg2NWNZUrI#!p > wAAvlV^sI41<6<;hHcoUy=A?e-|05l;7C8giM-Tt9*KBPx@rv+1OG3`f-+dwCzyJUM > > literal 0 > HcmV?d00001 > > diff --git a/ArmPkg/Library/GccLto/liblto-arm.s b/ArmPkg/Library/GccLto/liblto-arm.s > new file mode 100644 > index 000000000000..bc16320a46c0 > --- /dev/null > +++ b/ArmPkg/Library/GccLto/liblto-arm.s > @@ -0,0 +1,61 @@ > +// > +// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> > +// > +// This program and the accompanying materials are licensed and made available under > +// the terms and conditions of the BSD License that accompanies this distribution. > +// The full text of the license may be found at > +// http://opensource.org/licenses/bsd-license.php. > +// > +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > +// > + > +// > +// GCC in LTO mode interoperates poorly with non-standard libraries that > +// provide implementations of compiler intrinsics such as memcpy/memset > +// or the stack protector entry points. > +// > +// By referencing these functions from a non-LTO object that can be passed > +// to the linker via the -plugin-opt=-pass-through=-lxxx options, the > +// intrinsics are included in the link in a way that allows them to be > +// pruned again if no other references to them exist. > +// > + > + .long memcpy - . > + .long memset - . > + .long __stack_chk_fail - . > + .long __stack_chk_guard - . > + .long __ashrdi3 - . > + .long __ashldi3 - . > + .long __aeabi_idiv - . > + .long __aeabi_idivmod - . > + .long __aeabi_uidiv - . > + .long __aeabi_uidivmod - . > + .long __divdi3 - . > + .long __divsi3 - . > + .long __lshrdi3 - . > + .long __aeabi_memcpy - . > + .long __aeabi_memset - . > + .long memmove - . > + .long __modsi3 - . > + .long __moddi3 - . > + .long __muldi3 - . > + .long __aeabi_lmul - . > + .long __ARM_ll_mullu - . > + .long __udivsi3 - . > + .long __umodsi3 - . > + .long __udivdi3 - . > + .long __umoddi3 - . > + .long __udivmoddi4 - . > + .long __clzsi2 - . > + .long __ctzsi2 - . > + .long __ucmpdi2 - . > + .long __switch8 - . > + .long __switchu8 - . > + .long __switch16 - . > + .long __switch32 - . > + .long __aeabi_ulcmp - . > + .long __aeabi_uldivmod - . > + .long __aeabi_ldivmod - . > + .long __aeabi_llsr - . > + .long __aeabi_llsl - . > -- > 2.7.4 > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
diff --git a/ArmPkg/Library/GccLto/liblto-aarch64.a b/ArmPkg/Library/GccLto/liblto-aarch64.a new file mode 100644 index 0000000000000000000000000000000000000000..2ab00238f0dad882abf08a1fb9623c9cdea9f17b GIT binary patch literal 1016 zcmbu7&rZTX5XPqz6oLo!M8btcV>pmaJb3R#Pab@Ovb0qUG$GwJk&}<*)yMErJh~su zhGA(FBh#ci^V@G{X8(NLKR&dgh`dGgNxR5Xq8|a14Nj;_ot@whUR;}*D0W|+#ne8) z+crcqtbp?TKuy$d;Fk^js)5sWPGwPMt2G8wSV~i4b+$;e`67MRugg8~@}{d?w$pJf z%hU2Z13wYMF8ko8f}aWQH5;VNy0m&m%Ghc<&b?O^ORa42Zb{|ZYEm;}M9QPwkz0*h zki8>ef}gYSE})e*bOFvFk<j^57EYNXKak(^fcXvc@Z~)5d^m*lCr*Hz|6PAkvlcbK oxX>*EVPSp5Eivz1-~TrQyaBwMaQ{8W!rrlD%!Td{2n*}~0;u;a`v3p{ literal 0 HcmV?d00001 diff --git a/ArmPkg/Library/GccLto/liblto-aarch64.s b/ArmPkg/Library/GccLto/liblto-aarch64.s new file mode 100644 index 000000000000..45000d327758 --- /dev/null +++ b/ArmPkg/Library/GccLto/liblto-aarch64.s @@ -0,0 +1,27 @@ +// +// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> +// +// This program and the accompanying materials are licensed and made available under +// the terms and conditions of the BSD License that accompanies this distribution. +// The full text of the license may be found at +// http://opensource.org/licenses/bsd-license.php. +// +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +// + +// +// GCC in LTO mode interoperates poorly with non-standard libraries that +// provide implementations of compiler intrinsics such as memcpy/memset +// or the stack protector entry points. +// +// By referencing these functions from a non-LTO object that can be passed +// to the linker via the -plugin-opt=-pass-through=-lxxx options, the +// intrinsics are included in the link in a way that allows them to be +// pruned again if no other references to them exist. +// + + .long memcpy - . + .long memset - . + .long __stack_chk_fail - . + .long __stack_chk_guard - . diff --git a/ArmPkg/Library/GccLto/liblto-arm.a b/ArmPkg/Library/GccLto/liblto-arm.a new file mode 100644 index 0000000000000000000000000000000000000000..d811c09573a35ea87a8002ecf01be18e1c6e7fd3 GIT binary patch literal 2096 zcmd6o%WKq76vn?XQ*C|Js#WW|YOD1@u(oJH7cHm=wjd(Xg%C3{sS}#eGD-SEunQLz zT?o1mx)E36&V>ti;!4n^e}Mi6u3h<^n@J{fT<Fp}Ouq9w_nvbfNlqSKoxD~mm5{X( zhR`D5^G4ItF=}K8T}U0-`2R^Kc5yYX=T>}_x@dNmx{6!*W2si#P63O*VzW?IBihqh z=)ig*pojKb#bw326`xc*toV}R>x!op&nRA0ysG%I;^&HAD}JZ=gW^w$zbO8u_=n=3 zihn6C7jA)^cemm`#e<4%#TOM%D88Zij$&7Fpm;^`6UFO_-zdgF4UQAVZgtkF)@Pj= z*ALnp_Y=1vL)@s|sQDwQ6*Mh*7aYIlFNiybaLxo6PTG16rQHlllhBAv-k>#u2@Sol zI=`G}CPrQiN;tRR(ak(*AdNItn6xb{AamTrttlr6972!~lYGJ?&mg`uh4`8leFjDu zR1H=l|GXG+(@3h}e9gF`ML(|A$Jm)#Ny{9*kb6fYIz6K#U~GZXiE;<`AQQJZh#Ex* zvPafpsg(EM+QeEU%F9+!7AJXjt<6BM=oX+)l${4fw*md4-N1n8cCac_8FW^32XIbw zCm?m%V%-}PWwOhnEHdMwdw?sVdjY8%7AKh$-3Qzh-4EOrJpf1@u{il%(L=yJ(ZfJZ z^axNF?FRzUqrklAF(4K_4lIdsu@6KCfmP8Hz#~x>xiwL4;;HB<;F;)Y;DzWJUhHT& zjNJ+~ZlqeztcDlZv9}b%uDP)byAnmP`PA5M95?(*5_=I7{9EHzOij<eVx#1jh0yHv z<B{-Nm!6|^Pj~Rl*~wdJ;>*-d{<&4d*_Y!hx!AINvPBvHw{hmarpIg2NWNZUrI#!p wAAvlV^sI41<6<;hHcoUy=A?e-|05l;7C8giM-Tt9*KBPx@rv+1OG3`f-+dwCzyJUM literal 0 HcmV?d00001 diff --git a/ArmPkg/Library/GccLto/liblto-arm.s b/ArmPkg/Library/GccLto/liblto-arm.s new file mode 100644 index 000000000000..bc16320a46c0 --- /dev/null +++ b/ArmPkg/Library/GccLto/liblto-arm.s @@ -0,0 +1,61 @@ +// +// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> +// +// This program and the accompanying materials are licensed and made available under +// the terms and conditions of the BSD License that accompanies this distribution. +// The full text of the license may be found at +// http://opensource.org/licenses/bsd-license.php. +// +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +// + +// +// GCC in LTO mode interoperates poorly with non-standard libraries that +// provide implementations of compiler intrinsics such as memcpy/memset +// or the stack protector entry points. +// +// By referencing these functions from a non-LTO object that can be passed +// to the linker via the -plugin-opt=-pass-through=-lxxx options, the +// intrinsics are included in the link in a way that allows them to be +// pruned again if no other references to them exist. +// + + .long memcpy - . + .long memset - . + .long __stack_chk_fail - . + .long __stack_chk_guard - . + .long __ashrdi3 - . + .long __ashldi3 - . + .long __aeabi_idiv - . + .long __aeabi_idivmod - . + .long __aeabi_uidiv - . + .long __aeabi_uidivmod - . + .long __divdi3 - . + .long __divsi3 - . + .long __lshrdi3 - . + .long __aeabi_memcpy - . + .long __aeabi_memset - . + .long memmove - . + .long __modsi3 - . + .long __moddi3 - . + .long __muldi3 - . + .long __aeabi_lmul - . + .long __ARM_ll_mullu - . + .long __udivsi3 - . + .long __umodsi3 - . + .long __udivdi3 - . + .long __umoddi3 - . + .long __udivmoddi4 - . + .long __clzsi2 - . + .long __ctzsi2 - . + .long __ucmpdi2 - . + .long __switch8 - . + .long __switchu8 - . + .long __switch16 - . + .long __switch32 - . + .long __aeabi_ulcmp - . + .long __aeabi_uldivmod - . + .long __aeabi_ldivmod - . + .long __aeabi_llsr - . + .long __aeabi_llsl - .