Skip to contentSkip to conversation

ld --relax, yet still: "relocation truncated to fit: PCREL21B" or "can't relax section"

Linux-ia64 Steve Tynor 2 participants 3 messages Dec 21, 2000 – Jan 10, 2001

lore
Share & tools
lore
#0 lore raw

Help!

I am suddenly getting link errors that I cannot explain nor work around.

I am using gcc -Wl,--relax -- which _used_ to work around these relocation errors.

The errors come in two flavors:

| ./Tjdb-interp2/O.ia64-linux_n/plo_0.o: In function `func1':
| ./Tjdb-interp2/O.ia64-linux_n/plo_0.o(.text+0x1046862): relocation truncated to fit: PCREL21B func2
| ...
| collect2: ld returned 1 exit status

and just plain:

| /usr/bin/ld: can't relax section: No such file or directory | collect2: ld returned 1 exit status

These are linking different sets of .o files, but with essentially identical command lines in each case:

| gcc -Wl,--relax -o ia64-linux/j2/Static_2_n ./Tjdb-static2/O.ia64-linux_n/plo_0.o ./Tjdb-static2/O.ia64-linux_n/plo_1.o ./Tjdb-static2/O.ia64-linux_n/plo_2.o ./Tjdb-static2/O.ia64-linux_n/P.COM_twr_test_suite/Interp-main.o -L/u/tynor/Tower/java/ia64-linux/COM/twr/runtime/tjrtl/_OBJ-ia64-linux /u/tynor/Tower/java/ia64-linux/COM/twr/runtime/tjrtl/_OBJ-ia64-linux/libtjrtl_n.a -rdynamic -lm -ldl -lpthread

It seems to not matter what toolchain I use. I've tried both the bundled gcc:

	gcc version 2.9-ia64-000216-final
	GNU ld version 2.9-ia64-000216-final (with BFD 2.9-ia64-000216-final)
and a newer cygnus snapshot
        gcc version 2.96-ia64-000717 snap 000925
	GNU ld version 2.9-ia64-000717 (with BFD 2.9-ia64-000717))

Compiling with one and linking with the other; compiling and linking with the same. Makes no difference. Same link time errors in all four variants.

Help! I'm not running out of memory (real or virtual), or disk space. What's wrong?

Thanks,

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-Writing about music is like dancing about architecture. -- Frank Zappa

Steve Tynor Email: [email protected]
Tower Technology WWW: http://www.towerj.com/

#1 lore raw

Re: [Linux-ia64] ld --relax, yet still: "relocation truncated to fit: PCREL21B" or "can't relax sect

Quoted 4 lines
| ./Tjdb-interp2/O.ia64-linux_n/plo_0.o: In function `func1':
| ./Tjdb-interp2/O.ia64-linux_n/plo_0.o(.text+0x1046862): relocation truncated to fit: PCREL21B func2
| ...
| collect2: ld returned 1 exit status

Do you have a testcase I can look at? As far as I know, --relax still works.

This problem happens when you are calling a function that is too far away for the offset in a br.call instruction. Or jumping to a branch that is too far away. This could be a toolchain bug, or it could be a problem with the program.

Quoted 2 lines

| /usr/bin/ld: can't relax section: No such file or directory | collect2: ld returned 1 exit status

This was a temporary problem. It occurs if you have a toolchain with Richard Henderson's 2000-10-09 bfd patch for sorting unwind sections, but don't have his 2000-10-24 bfd patch which makes it work. I never released a toolchain with the first patch but not the second. Perhaps you got a toolchain from someone else? Or maybe you applied random patches from some mailing list to your toolchain?

Quoted 2 lines
       gcc version 2.96-ia64-000717 snap 000925
	GNU ld version 2.9-ia64-000717 (with BFD 2.9-ia64-000717))

This is 2 months obsolete. The 001117 snapshot should be used instead of this one.

Jim

#2 lore raw

Re: [Linux-ia64] ld --relax, yet still: "relocation truncated to fit: PCREL21B" or "can't relax sect

In reply to Steve Tynor

Jim Wilson wrote:

| >| ./Tjdb-interp2/O.ia64-linux_n/plo_0.o: In function `func1':
| >| ./Tjdb-interp2/O.ia64-linux_n/plo_0.o(.text+0x1046862): relocation truncated to fit: PCREL21B func2
| >| ...
| >| collect2: ld returned 1 exit status
| 
| Do you have a testcase I can look at?  As far as I know, --relax still works.
| 
| This problem happens when you are calling a function that is too far away
| for the offset in a br.call instruction.  Or jumping to a branch that is too
| far away.  This could be a toolchain bug, or it could be a problem with the
| program.

Aha! That explains it. It turns out that the .o files causing the problem are quite large (the result of linking a bunch of smaller ones together with "ld -r ...". By avoiding this and linking the smaller .o's directly into the executable, I can work around the bug.

| 
| >| /usr/bin/ld: can't relax section: No such file or directory
| >| collect2: ld returned 1 exit status
| 
| This was a temporary problem.  It occurs if you have a toolchain with Richard
| Henderson's 2000-10-09 bfd patch for sorting unwind sections, but don't have
| his 2000-10-24 bfd patch which makes it work.  I never released a toolchain
| with the first patch but not the second.  Perhaps you got a toolchain from
| someone else?  Or maybe you applied random patches from some mailing list
| to your toolchain?

The 2.9 toolchain is stock as it came with TurboLinux 0825.

The 2.96 toolchain was from your gcc-092500 snapshot with the glibc2.1.3 patch, "patch.022" and a gas and gcc patch that you sent me in email to address a WAW/WAR dependency I reported a while back.

| 
| >        gcc version 2.96-ia64-000717 snap 000925
| >	GNU ld version 2.9-ia64-000717 (with BFD 2.9-ia64-000717))
| 
| This is 2 months obsolete.  The 001117 snapshot should be used instead of this
| one.

When our hardware is upgraded, we plan to move to newer kernels, newer glibc's, and (I'm sure!) improved toolchains...

Thanks,
Steve