I found a much simpler and cleaner solution without involving any ldflags 
and without using 

--export-all-symbols


In my main.go (or whatever main package that contains the main func):

/*
#cgo LDFLAGS: ${SRCDIR}/main.def
__declspec(dllexport) unsigned long NvOptimusEnablement = 0x00000001;
__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
*/
import "C"


and main.def contents are:

EXPORTS
   NvOptimusEnablement @1 DATA
   AmdPowerXpressRequestHighPerformance @2 DATA


I can verify that I have only these exports using either this build option:

go install -x -ldflags "-v -extldflags -Wl,--output-def,exports.def"


or using dumpin tool:
dumpbin /exports engine-conversion.exe
Microsoft (R) COFF/PE Dumper Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file engine-conversion.exe

File Type: EXECUTABLE IMAGE

  Section contains the following exports for a.out.exe

    00000000 characteristics
    58AB2A03 time date stamp Mon Feb 20 20:40:19 2017
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          2    0 00189220 AmdPowerXpressRequestHighPerformance
          1    1 00189224 NvOptimusEnablement
...
...

On Monday, January 30, 2017 at 5:47:51 PM UTC+3, Hakan Guleryuz wrote:
>
> For anyone who wants to build a windows .exe with go-sdl2 and opengl, and 
> has an optimus driver, and wants to ensure that 
> the high performance gpu is selected by default for their final product, I 
> will document my findings here....
>
> I found the followingsolution, which can be proven that it works by having 
> this line in the go-sdl2 code:
>
> var vendorString string = gl.GoStringUb(gl.GetString(gl.VENDOR))
> fmt.Printf("Vendor String is %v \n", vendorString)
>
>
> which outputs:
> Vendor String is NVIDIA Corporation
> instead of
> Vendor String is Intel
>
> Also process explorer shows that the gpu memory usage is only on the 
> dedicated memory usage, 
> and also the opengl performance is much higher.
>
> The first thing to do is to have an export on the created object file. 
> I did this by putting this in my main .go file
>
> //__declspec(dllexport) unsigned long NvOptimusEnablement = 0x00000001;
> import "C"
>
>
> The corresponding object file now has this symbol but the linker removes 
> it, since it is building an .exe on windows,
> and I guess GNU GCC tool chain by default removes all symbols (I did not 
> try to switch the toolchain to Microsoft link.exe at this point)
>
> Then to have this symbols (and unfortunately all other symbols) get 
> exported in the final .exe I added this to the build options:
>
> go install -ldflags "-v -extldflags -Wl,--export-all-symbols" 
> pkgdnm/opengl3perftest
>
>
> now dumpbin /export shows a huge number of exported symbols on the .exe 
> and NvOptimusEnablement is one of them
> This works, and optimus driver automatically selects the dedicated GPU 
> when the executable is run, 
> but the down side is there are many more exported symbols.
> There is another option which is 
>
> --dynamic-list=dynamic_symbol_table.txt
>
>
> I put the contents of dynamic_symbol_table as just this
>
> {
>   extern "C"
>   {
>     "NvOptimusEnablement";
>   };
> };
>
>
> but this did not work, meaning nothing was exported. The GNU GCC 
> documentation is somewhat unclear 
> (https://sourceware.org/binutils/docs/ld/Options.html)
> "This option is only meaningful on ELF platforms "
>
> I could not find any option on gcc ld doc in section: " Options Specific 
> to i386 PE Targets" to limit the exported symbols to only what needed, 
> but as far as automatically selecting the dedicated GPU goal, goes, this 
> works.
>
> If anyone know a better/simpler way to export a symbol from .go file to 
> the object file to be linked
> or maybe know how to limit the exported symbols in the final executable 
> using gnu ld PE target options
> please comment.
>
> First in my main package I have these lines
> On Monday, January 23, 2017 at 7:13:30 PM UTC+3, Hakan Guleryuz wrote:
>>
>> In normal C/C++ SDL2 related app I write, adding the following code
>>
>> extern "C" {
>>    _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
>> }
>>
>> causes the driver system with integrated and dedicated nvidia gpu, to 
>> auto select the dedicated nvidia gpu. 
>>
>> See here for some explanation of the mechanism->
>> https://github.com/urho3d/Urho3D/issues/139
>>
>> http://stackoverflow.com/questions/16823372/forcing-machine-to-use-dedicated-graphics-card
>>
>>
>>
>> <http://stackoverflow.com/questions/16823372/forcing-machine-to-use-dedicated-graphics-card>
>>
>> I can view the exports of the final executable with "dumpbin /exports 
>> <executable name>"
>>
>> [dumpbin is a tool installed with visual studio C++ tools]
>>
>>
>> How can I make my go executable export this value symbol?
>>
>> I searched go link documentation but could not find something useful to 
>> achieve this.
>>
>> I did some tests with cgo and "//export" command with a simple var, but 
>> that did not have any effect on "dumpbin /exports" output (no symbols 
>> exported)
>>
>>
>> I can see which GPU the executable is using by inspecting it with 
>> "process explorer" and its "dedicated GPU memory usage"
>>
>>
>> The go build "go-sdl2" app, by default, uses the CPU's embedded low 
>> performance integrated GPU, since I can not export this value with the 
>> executable.
>>
>>
>> Thanks for any help.
>>
>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to