This is the mail archive of the mailing list for the binutils project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[ARM/gold] Fix the "DIV usage mismatch between blah.o and output" error

Gas in binutils 2.21 used to aggressively set the Tag_DIV_use flag to
1 (ie "Not allowed"), which will be propagated through the attribute
handling code in bfd/elf32-arm.c and gold/ and serve as the big
hammer to set Tag_DIV_use to 1 in the final output.

In 2.22 changes were made into gas and bfd to correctly allow 0 (ie
"Allowed in Thumb-ISA, v7-R or v7-M") and 2 (ie "Allowed in v7-A with
integer division extension") to co-exist, but gold is not picking up
the corresponding fix and it still strictly expects identical
Tag_DIV_use values across all binary files or at least a 1 to unify
the attribute.

Following are two simple test functions used to reproduce the problem:

int div(int i, int j)
    return i/j;

include <stdio.h>

extern int div(int, int);
int main()
    printf("4 / 2 = %d\n", div(4, 2));
    return 0;

If div.c is compiled with -mcpu=cortex-a15 and main.c is compiled with
-mcpu=cortex-a9, only div.o will have Tag_DIV_use set to 2 and main.o
will use the default value 0, but gold will fail to link them with the
DIV usage mismatch error.

This patch basically ports the new logic from bfd/elf32_arm.c over to
gold/ and with it the linker is able to link the program.

Attachment: div.o
Description: Binary data

Attachment: main.o
Description: Binary data

Attachment: gold_Tag_DIV_use.patch
Description: Binary data

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]