[Vm-dev] Exporting module symbols on windows

Igor Stasenko siguctua at gmail.com
Sun Feb 10 12:52:31 UTC 2013


On 10 February 2013 01:51, Eliot Miranda <eliot.miranda at gmail.com> wrote:
>
>
>
> On Sat, Feb 9, 2013 at 3:18 PM, Igor Stasenko <siguctua at gmail.com> wrote:
>>
>>
>> Hi, Eliot
>>
>> i thought about it, and i don't like it.
>> I am in favor of exporting stuff explicitly, rather than implicitly by
>> compiler..
>> because with implicit exports, you never know whether given symbol
>> will be visible or not..
>> and you have to guess and hope instead of being confident.
>>
>> It would be nice if we could have a way to export all functions and variables
>> which has <api> pragma.. because exporting everything , first is not
>> needed, second
>> it will expose some symbols which are really private to VM which is
>> not very good from design perspective.
>
>
> I agree. All you need to do on WIndows is to collect all the functions that are either marked as api, export: true or in requiredMethodNames and write a .def file.  The syntax of the def file is easy enough (just a list of names IIRC) that a Makefile could munge it to produce a set of flags for a linker (but it's a *lot* of flags :) ).  You might look at where the CodeGenerator produces cointerp.h and cogit.h and add the generation there.
>

There's already support for that in codebase
all we need is to use  __declspec( dllexport )  as recommended in [1].

(btw, it is already used by EXPORT() macro,
but this macro suitable only for declarations with known return type
(btw why?), so i took a freedom to add a new)..

- added VM_EXPORT macro
  in sq.h:

#define VM_EXPORT  /*nothing*/

  in win32/vm/sqPlatformSpecific.h:

#undef VM_EXPORT
#define VM_EXPORT __declspec( dllexport )

(in both cases right under EXPORT() macro definition)

- changed 3 methods in VMMaker, mainly to emit corresponding macros in
.headers (see attached)

i wonder, if it is syntactically correct to use
EXPORT() macro e.g. without parameter.. then VM_EXPORT not needed since
will be expanded into
EXPORT(/*nothing*/) =>  __declspec( dllexport ) /*nothing*/


And now running in windoze, i  can do:

 NativeBoost loadSymbol: #CFramePointer fromModule: NativeBoost VMModule
	 @ 16r5A5710

or:
 NativeBoost loadSymbol: #suppressHeartbeatFlag fromModule: NativeBoost VMModule
	 @ 16r5A56EC
	

voila!


[1] https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/win32.html


-- 
Best regards,
Igor Stasenko.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: VM-API-Exports.1.cs
Type: application/octet-stream
Size: 2129 bytes
Desc: not available
Url : http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20130210/4f21c314/VM-API-Exports.1.obj


More information about the Vm-dev mailing list