[yocto] prelink-cross with -fno-plt

Shane Peelar lookatyouhacker at gmail.com
Fri May 24 08:10:14 PDT 2019


I did some reading into the sources in other architectures.  The closest
match, arch_i386.c, makes the write conditional as you say.
So do other arches, including arch_arm.c, arch_sh.c, arch-mips.c, arch-s390.c,
arch-s390x.c, and arch-ia64.c.

Notably, arch-cris.c has the same assert as arch-x86_64.c instead of the
conditional.

The code roughly looks like follows:

1. Check for dso->info[DT_PLTGOT].  If it does not exist, return 0
2. Call addr_to_sec on dso->info[DT_PLTGOT], return 1 if error
3. Look for the section named ".plt" in the ELF.
4. If the section cannot be found, return 0
5. Otherwise, write the address of .plt + constant (dependent on arch) to
got[1]

In arch-x86_64.c and arch-cris.c, step (4) above is an assert:

1. Check for dso->info[DT_PLTGOT].  If it does not exist, return 0
2. Call addr_to_sec on dso->info[DT_PLTGOT], return 1 if error
3. Look for the section named ".plt" in the ELF.
4. Assert that the section was found
5. Write the address of .plt + constant (dependent on arch) to got[1]

I tested out making the assert conditional and nothing seemed to break at
least.


On Fri, May 24, 2019 at 12:08 AM Khem Raj <raj.khem at gmail.com> wrote:

>
>
> On 5/23/19 7:53 PM, Shane Peelar wrote:
> > Any of them on the system pretty much, and yes they are also built with
> > -fno-plt.
>
> OK, I think its better to them conditionally check for .plt section,
> can you describe more of whats going on when sections are checked.
>
> >
> > On Thu, May 23, 2019 at 9:59 PM Khem Raj <raj.khem at gmail.com
> > <mailto:raj.khem at gmail.com>> wrote:
> >
> >
> >
> >     On 5/23/19 8:05 AM, Shane Peelar wrote:
> >      > Hi Everyone @ the Yocto project,
> >      >
> >      > I'm Shane Peelar, a PhD Candidate at the University of Windsor.
> >      > I'm writing to you about prelink-cross, as part of the Yocto
> project.
> >      > Specifically, I'm looking at using it with executables built using
> >      > `-fno-plt` under GCC.
> >      > I wasn't quite sure where to send this email to, so I figured I'd
> >     try
> >      > here.  If there's a better place to send this, please let me know.
> >      >
> >      > Right now, prelink-cross seems to fail an assertion in
> >     arch-x86_64.c,
> >      > line 421, when
> >      > using it with an executable built with `-fno-plt`:
> >      >
> >      > ...
> >      > assert (i < dso->ehdr.e_shnum)
> >      > ...
> >      >
> >      > This snippet seems to be looking for the ".plt" section and,
> >     since it
> >      > can't find it, the assertion fires.  This makes sense because in
> >      > `-fno-plt` executables, the `.plt` section is missing entirely.
> >      > I'm not an expert on ELF stuff, although I am learning quickly.
> It
> >      > looks like
> >      > this code wants to write into GOT[1] the address of ".plt" + 0x16
> --
> >      > since ".plt" doesn't
> >      > exist, does it make sense to just change this assert to an if
> >     statement
> >      > like so:
> >      >
> >      > ...
> >      >        if (i < dso->ehdr.e_shnum)
> >      >        { ... }
> >      > ...
> >      >
> >      > and skip over that part?  Or is this a real error condition for
> >      > prelink-cross and it really should not continue?  The executable
> in
> >      > question is also non-PIE, if that makes a difference.
> >      >
> >
> >     what shared libs is this linking to ? are they also built with
> >     -fno-plt ?
> >
> >      > Thanks for your time,
> >      > Shane
> >      >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.yoctoproject.org/pipermail/yocto/attachments/20190524/5813dc20/attachment.html>


More information about the yocto mailing list