Date: Thu, 27 Jan 2005 12:15:09 -0800 From: Steve Kargl <sgk@troutmask.apl.washington.edu> To: "James R. Van Artsdalen" <james@jrv.org> Cc: freebsd-amd64@freebsd.org Subject: Re: What is R_X86_64_PC32? Message-ID: <20050127201509.GA96972@troutmask.apl.washington.edu> In-Reply-To: <41F94088.4050800@jrv.org> References: <20050127175934.GA44783@troutmask.apl.washington.edu> <41F94088.4050800@jrv.org>
index | next in thread | previous in thread | raw e-mail
On Thu, Jan 27, 2005 at 01:27:04PM -0600, James R. Van Artsdalen wrote:
> Steve Kargl wrote:
>
> >This simple fortran program:
> >
> > program kk
> > implicit none
> > integer N
> > parameter (N=32768)
> > real input(N,N)
> > input(1,1) = 1.e0
> > end program kk
> >
> >
> >when compiled by either the system's f77 command or gfortran,
> >generates the following error:
> >
> >troutmask:kargl[217] f77 -o df df.f
> >/usr/lib/crt1.o(.text+0x15): In function `_start':
> >: relocation truncated to fit: R_X86_64_PC32 environ
> >Is this an indication that the stack isn't large enough?
> >
> I don't think this is anything you're doing.
>
> The error is actually a relocation being applied to the startup code in
> crt1.c:
>
> /* The entry function. */
> void
> _start(char **ap, void (*cleanup)(void))
> {
> int argc;
> char **argv;
> char **env;
> const char *s;
>
> argc = *(long *)(void *)ap;
> argv = ap + 1;
> env = ap + 2 + argc;
>
> I think the linker is getting the error trying to fixup the write to env
> here:
>
> 0000000000000000 <_start>:
> 0: 41 54 push %r12
> 2: 55 push %rbp
> 3: 53 push %rbx
> 4: 8b 2f mov (%rdi),%ebp
> 6: 4c 8d 67 08 lea 0x8(%rdi),%r12
> a: 48 63 dd movslq %ebp,%rbx
> d: 48 8d 5c df 10 lea 0x10(%rdi,%rbx,8),%rbx
> 12: 48 89 1d 00 00 00 00 mov %rbx,0(%rip) # 19
> <_start+0x19>
>
> I *think* that last line is the write to env? In that case there's only
> room for a 32-bit offset between the address of this code and that of env.
>
> Peter, Dave: do we require that statically allocated data be within 2 GB
> of any code that might reference it by name?
>
> Even if that's true it's not obvious to me why your test program isn't
> meeting such a requirement?
Thanks for the explanation. It gets even worse if you try to compile
a static program.
troutmask:kargl[206] f77 -o df -static df.f
/usr/lib/crt1.o(.text+0x15): In function `_start':
: relocation truncated to fit: R_X86_64_PC32 environ
/usr/lib/libg2c.a(s_stop.o)(.text+0x39): In function `s_stop':
: relocation truncated to fit: R_X86_64_PC32 __isthreaded
/usr/lib/libg2c.a(setarg.o)(.text+0x2): In function `f_setarg':
: relocation truncated to fit: R_X86_64_PC32 f__xargc
/usr/lib/libg2c.a(setarg.o)(.text+0x9): In function `f_setarg':
: relocation truncated to fit: R_X86_64_PC32 f__xargv
/usr/lib/libg2c.a(err.o)(.text+0xa): In function `f__canseek':
: relocation truncated to fit: R_X86_64_PC32 __isthreaded
/usr/lib/libg2c.a(err.o)(.text+0x80): In function `f__canseek':
: relocation truncated to fit: R_X86_64_PC32 __isthreaded
/usr/lib/libg2c.a(err.o)(.text+0x146): In function `f__fatal':
: relocation truncated to fit: R_X86_64_PC32 .bss
/usr/lib/libg2c.a(err.o)(.text+0x172): In function `f__fatal':
: relocation truncated to fit: R_X86_64_PC32 .bss
/usr/lib/libg2c.a(err.o)(.text+0x17c): In function `f__fatal':
: relocation truncated to fit: R_X86_64_PC32 f__init
/usr/lib/libg2c.a(err.o)(.text+0x18a): In function `f__fatal':
: relocation truncated to fit: R_X86_64_PC32 f__curunit
/usr/lib/libg2c.a(err.o)(.text+0x194): In function `f__fatal':
: additional relocation overflows omitted from the output
It seems that FreeBSD is stuck with a 2GB address space if
you have static memory allocation.
--
Steve
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050127201509.GA96972>
