Messages in this thread | | | Date | Wed, 13 Mar 2024 13:21:26 +0100 | From | "Arnd Bergmann" <> | Subject | Re: [PATCH] mtd: ubi: avoid expensive do_div() on 32-bit machines |
| |
On Wed, Mar 13, 2024, at 13:10, Zhihao Cheng wrote: > 在 2024/3/13 19:53, Arnd Bergmann 写道: >> On Wed, Mar 13, 2024, at 12:29, Zhihao Cheng wrote: >> >> The way it usually goes is that someone adds an open-coded >> 64-bit division that causes a link failure, which prompts > I'm a little confused, what kind of link failure? Could you show an example?
The open-coded 64-bit division without using do_div() shows up as
x86_64-linux-ld: drivers/mtd/ubi/nvmem.o: in function `ubi_nvmem_reg_read': nvmem.c:(.text+0x10a): undefined reference to `__umoddi3' x86_64-linux-ld: nvmem.c:(.text+0x11f): undefined reference to `__udivdi3' x86_64-linux-ld: drivers/mtd/ubi/nvmem.o: in function `ubi_nvmem_reg_read.cold': nvmem.c:(.text.unlikely+0x2d): undefined reference to `__umoddi3'
The idea is that gcc expects __umoddi3 to be provided by libgcc, but Linux intentionally leaves it out in order to catch accidental 64-bit divisions.
Arnd
| |