Re: a relocatable non-pic executable

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jul 26, 2010 at 6:59 PM, Mathieu Lacage
<mathieu.lacage@xxxxxxxxx> wrote:
> On Mon, Jul 26, 2010 at 6:38 PM, Mathieu Lacage
> <mathieu.lacage@xxxxxxxxx> wrote:
>> I am trying to figure out if it is possible to generate a relocatable
>> non-pic executable: it looks like generating an executable does not
>
> I forgot to specify that I am trying to do this on ia32 and x86_64.

-bash-3.2$ uname -p
x86_64
-bash-3.2$ cat /etc/fedora-release
Fedora release 10 (Cambridge)
-bash-3.2$ gcc --version
gcc (GCC) 4.3.2 20081105 (Red Hat 4.3.2-7)
-bash-3.2$ cat test.c
void bar (void)
{}
int main (int argc, char *argv[])
{
  bar ();
  return 0;
}
-bash-3.2$ gcc -c test.c -o test.o
-bash-3.2$ readelf -r ./test.o
Relocation section '.rela.text' at offset 0x550 contains 1 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000000016  000800000002 R_X86_64_PC32     0000000000000000 bar +
fffffffffffffffc
...
-bash-3.2$ gcc test.o -o test
-bash-3.2$ readelf -r ./test
Relocation section '.rela.dyn' at offset 0x328 contains 1 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000600838  000100000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
...
-bash-3.2$ gcc  -Wl,--verbose -o test test.o|grep -B3 .rela.text
  .rela.dyn       :
    {
      *(.rela.init)
      *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)

To summarize: gcc generates the right relocation, the linker script
says that it should preserve the section it is located in (.rela.text
should go in .rela.dyn), the final output binary contains .rela.dyn
but it does not contain the relocation anymore.

I tried -Wl,-r but this complains about a missing libgcc_s.a which I
replaced with libgcc.a and the result is an ELF file without even a
program header :/

I am _very_ stubborn, so, I tried to be smarter (which is obviously
not sufficient):

-bash-3.2$ gcc -mcmodel=large -c test.c -o test.o
-bash-3.2$ ld -shared ./test.o -o test
-bash-3.2$ readelf -r ./test
Relocation section '.rela.dyn' at offset 0x220 contains 3 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
...
00000000027f  000600000001 R_X86_64_64       0000000000000268 bar + 0
-bash-3.2$ ./test
Segmentation fault

Ok, well, I can imagine why this fails: I tried linking statically
against all the right gcc object files and libs but to no avail.

At this point, I am interested in the answer to my original question
mostly because I am curious.

Mathieu
-- 
Mathieu Lacage <mathieu.lacage@xxxxxxxxx>


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux