[Ltrace-devel] [PATCH v2] Tracing PLT-less MIPS binaries
Faraz Shahbazker
faraz.shahbazker at imgtec.com
Fri Feb 6 19:47:33 UTC 2015
On 02/05/2015 03:44 PM, Petr Machata wrote:
> Faraz Shahbazker <faraz.shahbazker at imgtec.com> writes:
>
>> To capture the last one, I've added a check for whether proc->pid occurs
>> in options.h:opt_p - not sure if there is a simpler way of performing
>> this check.
>
> Both a -p and a command can be given. Probably not something that would
> typically be used, but nonetheless this is not a correct way to check
> for this.
>
> arch_dylink_done is called either for a process whose execution ltrace
> has under control (i.e. initial process or forks of already traced
> processes), or always for a process that we attach to. In theory it can
> be called even though arch_dylink_ was not, in fact, _done, there's no
> deep logic in ltrace to figure out whether the dynamic linker actually
> did finish doing its thing.
>
> Which is a shame, but still you could use the callback to make a mark
> somewhere and later check it. Or create breakpoins as delayed and only
> activate them in the callback--that's what PPC does.
It seems like there is no easy way to determine whether GOT entries are biased or not before arch_dynlink_done is called, which makes it impossible to determine if a symbol is resolved or unresolved when creating the plt entry. How about if we create all those fake plt entries as UNRESOLVED(+delayed) initially and determine otherwise only in arch_symlink_done? This avoids my absurd conditional bias logic.
arch_elf_add_plt_entry(...)
{
...
/* All symbols unconditionally unresolved at this point */
libsym->arch.type = MIPS_PLT_UNRESOLVED;
libsym->arch.resolved_value = stub_addr + bias;
libsym->arch.got_entry_addr = got_entry_addr + bias;
libsym->arch.delayed = 1;
...
}
arch_dynlink_done(struct process *proc)
{
for (libsym in <each delayed symbol>) {
read_got_entry(proc, libsym->arch.got_entry_addr, &got_entry_value);
if (got_entry_value != libsym->arch.resolved_value) {
/* Symbol is resolved, mark it as NEED_UNRESOLVE and create unresolve_data */
...
}
activate_delayed_symbol();
}
}
Regards,
Faraz Shahbazker
More information about the Ltrace-devel
mailing list