[PATCH 4/6] arm: Use the WEAK assembly entry point consistently
Tom Rini
trini at konsulko.com
Tue Dec 6 22:43:53 CET 2022
On Thu, Nov 24, 2022 at 12:40:44AM +0100, Pali Rohár wrote:
> On Wednesday 23 November 2022 18:15:17 Tom Rini wrote:
> > On Wed, Nov 23, 2022 at 11:50:59PM +0100, Pali Rohár wrote:
> > > On Tuesday 22 November 2022 12:31:56 Tom Rini wrote:
> > > > It is a bad idea, and more modern toolchains will fail, if you declare
> > > > an assembly function to be global and then weak, instead of declaring it
> > > > weak to start with. Update assorted assembly files to use the WEAK macro
> > > > directly.
> > > >
> > > > Signed-off-by: Tom Rini <trini at konsulko.com>
> > >
> > > During debugging of Nokia N900 code I was looking at this and I
> > > originally thought that this redefinition is the issue why N900 u-boot
> > > did not work... (but as we now know, the n900 issue was somewhere else).
> > >
> > > So I agree with this change, feel free to add my:
> > >
> > > Reviewed-by: Pali Rohár <pali at kernel.org>
> > >
> > > ... but even after this change, linked u-boot.bin binary is
> > > not-so-correct. It works but has an issue: In final u-boot.bin binary
> > > there is both weak and non-weak version of every weak function. You can
> > > verify it for example by looking at "save_boot_params" code (really
> > > code, not just symbol) in u-boot ELF binary.
> > >
> > > The reason for this is that linker (even LTO enabled) cannot eliminate
> > > code for weak version of function because it does not know how to
> > > "drop" it from binary/assembly code. So linker just set that non-weak
> > > version of function is active and let non-weak version present in binary
> > > as probably dead code.
> > >
> > > This is affected only by assembly files, not by C files, because gcc is
> > > called with -ffunction-sections -fdata-sections flags which cause that
> > > every (weak) function is in its separate section (so C function
> > > "int abc() { ... }" is put into the section ".text.abc" instead of
> > > ".text") and linker's flag --gc-sections (or LTO optimization) then drop
> > > all unreferenced sections.
> > >
> > > I do not know how fix this issue in assembly files. But cannot be WEAK
> > > macro modified to change section to ".text.<entry_name>" to mimic C
> > > compiler behavior? Would this cause any issues?
> >
> > Yes, you're right about the cause, and potential solution. If you can
> > come up with a way to get each assembly function put in to a separate
> > .text.funcname section, that would be great and much appreciated. I
> > think I tried this at one point a long long time ago and it did work,
> > but I didn't have something clean, either. I think I was hoping that the
> > linux kernel folks would solve it in time, but they decided the
> > time/effort for --gc-sections wasn't worth it, in the end.
>
> I quickly looked at this. If "as" is invoked with --sectname-subst flag
> then it is possible to use '.section %S.<func_name>' and '.previous'
> directives. See documentation where is example of that:
> https://sourceware.org/binutils/docs/as/Section.html#ELF-Version
>
> I experimented with adding into include/linux/linkage.h:
>
> #define WEAKSECT(name) \
> .section .text.name ASM_NL \
> WEAK(name)
>
> #define ENDPROCSECT(name) \
> ENDPROC(name) ASM_NL \
> .previous
>
> And then defining in arch/arm/cpu/armv7/start.S:
>
> WEAKSECT(save_boot_params)
> b save_boot_params_ret
> ENDPROCSECT(save_boot_params)
>
> (Note that n900 has custom non-weak save_boot_params)
>
> Then I run:
>
> make CROSS_COMPILE=arm-linux-gnueabi- nokia_rx51_defconfig u-boot.bin KBUILD_LDFLAGS="--print-gc-sections"
>
> And it showed me:
>
> ld: removing unused section '.text.save_boot_params' in file 'arch/arm/cpu/armv7/start.o'
>
> So seems that it is working.
>
> For proper integration it would be needed to integrate --sectname-subst
> flag support and then replace all usage by new macros.
That's all good to know, thanks for digging more. It would be good to
know if a quick and dirty experimental patch showed enough size savings
to be worth a more full pursuit or if we really don't have many / any
unused assembly functions or what we do have unused could be more easily
handled with an ifdef or refactoring into multiple files.
--
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20221206/03ebabf7/attachment.sig>
More information about the U-Boot
mailing list