views:

117

answers:

1

How to call a name-mangled symbol from C?

module.name:version

void* function(TypeSig); // Type of the function

I'd want to be able to use codepaths written in my language in C. The function calling convention is about the same. It's just that I must mangle in the version and the module path inside the symbols I export, and I have the same identifier convention as C has, therefore I can't just use underscore.

+2  A: 

IIUC, you are defining your own language, and are looking for a suitable name mangling algorithm.

You might want to use the Intel et.al. Itanium name mangling algorithm, which is used by g++ on all platforms. For the specific case, you might mangle each of your names as if the C++ declaration was

namespace module{ namespace name { namespace Vversion /*e.g. V1_0 */ {
  void *function(int){}
}}}

which would mangle as

_ZN6module4name4V1_08functionEi

As all your symbols use that algorithm, they can't conflict with each other. They also can't conflict with a standard C function called _ZN6module4name4V1_08functionEi, as all names starting with _Z (or, _UPPERCASE) are reserved for the implementation (of C). If you want convenient callability from g++, you can use this exact convention; else you pick a letter different from Z.

Martin v. Löwis
The type of the identifier is uninteresting (because it's always the same). Therefore It's cleaner to do: _W6module4nameV1. Anyway, thank you from showing this one out.There's only `void* fn(TypeSig)` -functions because of the post-linking process.
Cheery