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

Ben Cheng bccheng@google.com
Mon Jan 7 17:44:00 GMT 2013


Hi Ian,

Could you take a look at this patch?

Thanks,
-Ben

On Sat, Dec 22, 2012 at 3:49 PM, Doug Kwan (關振德) <dougkwan@google.com> wrote:
> LGTM but you need Ian's approval.
>
> On Wed, Dec 19, 2012 at 9:32 AM, Ben Cheng <bccheng@google.com> wrote:
>> 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/arm.cc 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:
>>
>> div.c:
>> int div(int i, int j)
>> {
>>     return i/j;
>> }
>>
>> main.c:
>> 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/arm.cc and with it the linker is able to link the program.



More information about the Binutils mailing list