hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

translate.ha (855B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 use rt;
      5 
      6 // Tries to translate a pointer into an ELF address of the currently running
      7 // binary.
      8 export fn translate(ptr: uintptr) (uintptr | void) = {
      9 	let dl_info = rt::dl_info { ... };
     10 
     11 	// In order to avoid translating symbols in shared libaries and
     12 	// producing invalid results, use the current function (which should be
     13 	// in the main binary) to get the base image address.
     14 	//
     15 	// Theoretically, it should be possible to get symbol names from shared
     16 	// libaries. You would have to load the ELF shared libary at the path
     17 	// [[dl_info.fname]] as an ELF image and resolve the symbol name
     18 	// from there. Then you could do "s/&translate/ptr" below.
     19 	const ret = rt::dladdr(&translate: *opaque, &dl_info);
     20 	if (ret != 0) {
     21 		return ptr - dl_info.fbase: uintptr;
     22 	};
     23 };