https://sourceware.org/bugzilla/show_bug.cgi?id=18963
Bug ID: 18963 Summary: Addition is not commutative Product: binutils Version: 2.25 URL: http://www.zytor.com/pub/git/dos/virtio9p.git/ Status: NEW Severity: normal Priority: P2 Component: ld Assignee: unassigned at sourceware dot org Reporter: felix.von.s at posteo dot de Target Milestone: --- Created attachment 8610 --> https://sourceware.org/bugzilla/attachment.cgi?id=8610&action=edit Failing linker script I've recently stumbled upon <http://www.zytor.com/pub/git/dos/virtio9p.git/> and decided to try it. I cloned the repository, ran "make", started the executable in qemu, and it promptly crashed. I looked into the map file and noticed that the entry point address in the header is wrong. After about half an hour, I found a fix: +++ dostsr.ld - __init_lma = __dgroup_lma + __rbss_start - __init_vma; + __init_lma = __dgroup_lma - __init_vma + __rbss_start; [...] - _exe_start = _start + __rbss_start - __init_vma; + _exe_start = _start - __init_vma + __rbss_start; [...] - _edata_premove = _edata + __rbss_start - __init_vma; + _edata_premove = _edata - __init_vma + __rbss_start; For some reason, wherever the linker script contained definition of the form A = B + C - D, ld silently took it to mean A = B + C + D. Changing the order of summation fixed the problem. It doesn't always happen, though: when I tried to create a minimal test case, sometimes the link succeeded, sometimes it didn't. The result seems to depend on whether there is overflow in the computation. The attached script fails to link; however, if I instead set D = A - B + C and E = A + C - B, it links successfully. gold refused to link the original executable altogether, since it has overlapping sections (for good reasons, though). The attached script is linked without surprises. -- You are receiving this mail because: You are on the CC list for the bug. _______________________________________________ bug-binutils mailing list bug-binutils@gnu.org https://lists.gnu.org/mailman/listinfo/bug-binutils