Key difference in the out of ld -pie and ld without -pie?

Peng Yu pengyu.ut@gmail.com
Fri Apr 23 13:03:16 GMT 2021


On 4/23/21, Tadeus Prastowo <tadeus.prastowo@unitn.it> wrote:
> On Fri, Apr 23, 2021 at 1:30 AM Peng Yu via Binutils
> <binutils@sourceware.org> wrote:
>>
>> Hi,
>>
>> I am trying to see the key difference between ld -pie and ld without
>> it in terms of the a.out output. I tried the following example.
>>
>> $ cat hello.s
>>         .text
>>         .global main
>> main:
>>         lea     s(%rip), %rdi
>>         call    puts@PLT
>>         xor     %rax, %rax
>>         ret
>>         .section        .rodata
>> s:
>>         .string "Hello World!"
>>
>> $ as -c -o hello.o hello.s
>> $ cmd=(
>>         ld
>>         -pie
>>         -dynamic-linker /lib64/ld-linux-x86-64.so.2
>>         /usr/lib/x86_64-linux-gnu/crt1.o
>>         /usr/lib/x86_64-linux-gnu/crti.o
>>         /usr/lib/x86_64-linux-gnu/crtn.o
>>         -lc)
>> $ "${cmd[@]}"
>>
>> diff of `readelf -lW`, `readelf -SW` and `objdump -d` running on a.out
>> generated by ld with and without -pie does show some differences. But
>> I mainly notice the differences in the addresses.
>>
>> I am afraid that I may miss some more important differences on
>> positional independence.  Could anybody show me where is the key part
>> relevant to positional independence?
>
> That I will leave for others to help as of now.
>
>> Also, this example used libc. Is there an even simpler program that
>> doesn't depend on libc yet is more suitable for demonstrating the
>> effect of -pie of ld? I am afarid to show the effect of pie, libc is
>> not necessary to be dependent on.
>>
>> I tried the following program. But -pie can not be used with ld. So
>> this simplification is not successful.
>>
>> $ as -o hello.o ../hello.s
>> $ ld -pie hello.o
>> ld: hello.o: relocation R_X86_64_32S against `.text' can not be used
>> when making a PIE object; recompile with -fPIE
>>
>>
>>         .global _start
>>
>>         .text
>> _start:
>>         # write(1, message, 13)
>>         mov     $1, %rax                # system call 1 is write
>>         mov     $1, %rdi                # file handle 1 is stdout
>>         mov     $message, %rsi          # address of string to output
>>         mov     $13, %rdx               # number of bytes
>>         syscall                         # invoke operating system to
>> do the write
>>
>>         # exit(0)
>>         mov     $60, %rax               # system call 60 is exit
>>         xor     %rdi, %rdi              # we want return code 0
>>         syscall                         # invoke operating system to exit
>> message:
>>         .ascii  "Hello, world\n"
>
> I simplified your hello.s and did:
> $ cat hello.s
>         .text
>         .global main
> main:
>         lea     s(%rip), %rdi
>         xor     %rax, %rax
>         ret
>         .section        .rodata
> s:
>         .string "Hello World!"
> $ as -c -o hello.o hello.s
> $ ld -pie hello.o
> ld: warning: cannot find entry symbol _start; defaulting to
> 0000000000000221
>
> It's just a warning.  I obtained the a.out executable.  Now you can
> try this on your own and perform further experiments.

It doesn't run. The output should be able to run.

$ ./a.out
-bash: ./a.out: No such file or directory

-- 
Regards,
Peng


More information about the Binutils mailing list