Re: [PATCH 3/7] objtool: Add support for intra-function calls

From: Alexandre Chartre
Date: Fri Apr 03 2020 - 03:02:36 EST



On 4/2/20 5:54 PM, Josh Poimboeuf wrote:
On Thu, Apr 02, 2020 at 05:04:07PM +0200, Peter Zijlstra wrote:
On Thu, Apr 02, 2020 at 03:24:45PM +0200, Alexandre Chartre wrote:
On 4/2/20 2:53 PM, Julien Thierry wrote:
On 4/2/20 9:22 AM, Alexandre Chartre wrote:

+ÃÂÃÂÃÂ sec = find_section_by_name(file->elf,
+ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ ".rela.discard.intra_function_call");

I'm wondering, do we really need to annotate the intra_function_call
and group the in a section?

Would it be a problem to consider all (static) call instructions with
a destination that is not the start offset of a symbol to be an
intra-function call (and set insn->intra_function_call and
insn->jump_dest accordingly)?

Correct, we could automatically detect intra-function calls instead of
having to annotate them. However, I choose to annotate them because I don't
think that's not an expected construct in a "normal" code flow (at least
on x86). So objtool would still issue a warning on intra-function calls
by default, and you can annotate them to indicate if they are expected.

I wondered the same thing when reading the patch. I'm confliected on
this. On the one hand auto-detecting this seems like an excellent idea.

If/when the compiler generates them, they had better be okay too.

Josh?

In general I prefer to keep it simple, and keep the annotations to a
minimum. And I don't think this warning has ever found anything useful.
So I'd be inclined to say just allow them and automatically detect them.

However the fact that arm64 asm actually uses them worries me a bit.

So for me it kind of hinges on whether arm64 has a legitimate use case
for them, or if the warning actually points to smelly code.


Then what I can do is:
- by default, automatically detect and validate intra-function calls
- remove the INTRA_FUNCTION_CALL annotation
- add an objtool option to print a warning about intra-function calls
(but still validate such calls).

This way by default intra-function calls are automatically detected and
validated. But you still have the option to print them out if you want
to check if there are any intra-function calls.

alex.