On Fri, 11 Mar 2022 23:40:36 GMT, Thomas Stuefe <[email protected]> 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