<< Back to previous view

[PCC-341] -g causes "relocation truncated to fit: R_X86_64_32 against `.text'" Created: 01/May/11  Updated: 03/May/11

Status: Closed
Project: pcc
Component/s: amd64 target
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Major
Reporter: Iain Hibbert Assignee: Anders Magnusson
Resolution: Fixed Votes: 0
Environment: NetBSD/amd64


 Description   
I found a problem linking code compiled with -g flag on amd64. The example code is
just a structure definition (which might be irrelevant anyway?)

struct foo {
        int a;
        short b;
};

when compiled with the following command

  pcc -g -c d.c

then trying to link with the following command (as per building a kernel with text section in high 2Gb of RAM, I think)

  /usr/tools/bin/x86_64--netbsd-ld -Ttext 0xffffffff80100000 -o d d.o

will fail with messages about truncated relocations

d.o:(.stab+0x14): relocation truncated to fit: R_X86_64_32 against `.text'
d.o:(.stab+0xc8): relocation truncated to fit: R_X86_64_32 against `.text'
d.o:(.stab+0xd4): relocation truncated to fit: R_X86_64_32 against `.text'
d.o:(.stab+0xe0): relocation truncated to fit: R_X86_64_32 against `.text'

this works with gcc and I'm not sure what the problem is.. looking at the generated assembler output

.stabs "/tmp/ctm.10018a",100,0,0,.LL10
.LL10:
.stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0
.stabs "char:t2=r2;0;127;",128,0,0,0
.stabs "short:t3=r1;-32768;32767;",128,0,0,0
.stabs "long:t4=r1;-9223372036854775808;9223372036854775807;",128,0,0,0
.stabs "long long:t5=r1;-9223372036854775808;9223372036854775807;",128,0,0,0
.stabs "unsigned char:t6=r1;0;255;",128,0,0,0
.stabs "unsigned short:t7=r1;0;65535;",128,0,0,0
.stabs "unsigned int:t8=r1;0;4294967295;",128,0,0,0
.stabs "unsigned long:t9=r1;0;-1;",128,0,0,0
.stabs "unsigned long long:t10=r1;0;-1;",128,0,0,0
.stabs "float:t11=r1;4;0;",128,0,0,0
.stabs "double:t12=r1;8;0;",128,0,0,0
.stabs "long double:t13=r1;12;0;",128,0,0,0
.stabs "void:t14=r14",128,0,0,0
.stabs "debugsyms.c",132,0,0,.LL11
.LL11:
.stabs "debugsyms.c",132,0,0,.LL12
.LL12:
.stabs "",100,0,0,.LL13
.LL13:
.ident "PCC: pcc 1.1.0.DEVEL (netbsd)"
.end

I believe it could be that the .LL?? symbols are stored in the .text section but maybe should
be elsewhere, or represented differently..

for what its worth, gcc produces different assembler but uses a .quad to store reference to
labels from the .text section, and a .long to reference labels in a 'debug_info,"",@progbits'
section

 Comments   
Comment by Anders Magnusson [ 03/May/11 01:27 PM ]
pcc only emits stabs, but I assume gcc uses dwarf2 for debugging. I don't know how well supported stabs is.
Comment by Iain Hibbert [ 03/May/11 09:55 PM ]
Ah I see, gcc can emit stabs also using -gstabs, but I note that this also fails to link
using a high text section start address..

I guess the stabs values are limited to 32-bit, and this would not be a pcc bug (except
that stabs is old hat, dwarf is the newer target but I don't know which is more useful)
Comment by Anders Magnusson [ 03/May/11 10:07 PM ]
I think dwarf is many times better, but more difficult to write also.
There should be dwarf support added though. Anyway, closing this issue.
Generated at Thu Nov 27 17:06:38 CET 2014 using JIRA Enterprise Edition, Version: 3.13.1-#333.