Starting the runtime and calling the init functions are handled by a
global initializer in the .so. In glibc argc/v are passed to the
global initializer, and I believe the Go runtime will use them to
initialize os.Args.

Calls to exported functions will block until the runtime is initialized.

On Thu, Sep 1, 2016 at 4:12 PM, Benoît Canet
<[email protected]> wrote:
>
> Hi thanks a lot for your explanations.
>
> So we are suposed to load the c-shared so then run the init().
>
> Do we must pass argc, argv to the .so initializer and that all ?
>
> Or must we then call GoStart after doing this ?
>
> Best regards
>
> Benoît
>
>
>
> On Thu, Sep 1, 2016 at 9:54 PM, David Crawshaw <[email protected]> wrote:
>>
>> On Thu, Sep 1, 2016 at 3:50 PM, Nadav Har'El <[email protected]> wrote:
>> >
>> > On Thu, Sep 1, 2016 at 10:40 PM, David Crawshaw <[email protected]>
>> > wrote:
>> >>
>> >> It sounds like you'll need to use external linking if you need
>> >> runtime.tlsg to be TLS IE. Using c-shared is reasonable if you have
>> >> some machinery to do the equivalent of dlopen and call the global
>> >> initializer the runtime inserts into the c-shared library.
>> >>
>> >> Does OSv support the equivalent of dynamically loading a .so that uses
>> >> TLS IE? If so, buildmode=c-shared is a good way to go.
>> >
>> >
>> > Yes, exactly - OSv basically revolves around a dynamic linker which can
>> > load ELF objects (shared object, PIE, etc.), link their references to
>> > glibc
>> > to the implementation in the OSv kernel (and also allow resolving
>> > references between different shared libraries, as usual) - and then run
>> > the result. And TLS IE is supported.
>> >
>> > So yes, buildmode=c-shared indeed sounds like the best build mode for
>> > us.
>> > It seems that buildmode=c-shared hides *all* the functions from the
>> > dynamic
>> > linker, though, so I guess we'll need to "export" at least the main()
>> > function.
>> >
>> > I wonder, by the way, why is exporting main() not the default?
>> > How is c-shared usable without exporting anything?
>>
>> Any function exported by cgo is exported in a c-shared library.
>>
>> https://golang.org/pkg/cmd/cgo/#hdr-C_references_to_Go
>>
>> So if you declare:
>>
>> package main
>>
>> import "C"
>>
>> func main() {} // never called in c-shared mode
>>
>> //export GoStart
>> func GoStart() {
>>   // ... your program
>> }
>>
>> Then your loader will be able to resolve "GoStart".
>>
>> > Nadav.
>
>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to