On Fri, 11 Mar 2022 23:40:36 GMT, Thomas Stuefe <stu...@openjdk.org> wrote:

> I spent some time doing a static implementation of SafeFetch on Linux x64, 
> and its not super trivial. The problem is that we need to know addresses of 
> instructions inside that function. I can set labels in assembly, and I can 
> export them, but so far I have been unable to use them as addresses in C++ 
> code. I will research some more.

There are basically two ways (easy) to do it. Put global symbols like


        .globl address_of_label
address_of_label:


into the assembler sources and use

```c++
        extern char address_of_label[] __attribute__ ((visibility ("hidden")));


from the C++ side.

Or use a local label, and export the difference to the function start to a 
local label in a global data symbol from the assembler side:


        .globl SafeFetch // Real function name goes here.
SafeFetch:
        // …
.Llabel:
        // …

        .section .rodata
        .globl SafeFetch_label_offset
        .p2align 3
SafeFetch_label_offset:
        .quad .Llabel - SafeFetch
        .type SafeFetch_label_offset, @object
        .size SafeFetch_label_offset, 8


And use

```c++
extern uintptr_t SafeFetch_label_offset __attribute__ ((__visibility 
("hidden")));


and the expression `(uintptr_t) &SafeFetch + SafeFetch_label_offset` to compute 
the final address. The second approach is friendlier to tools (which may get 
confused by symbols in the middle of functions).

If you have a PR, please Cc: me on it, I will have a look.

-------------

PR: https://git.openjdk.java.net/jdk/pull/7727

Reply via email to