github.com/bir3/gocompiler@v0.9.2202/src/cmd/cgo/internal/test/issue4029.go (about)

     1  // Copyright 2012 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build !windows && !static && !(darwin && internal)
     6  
     7  // Excluded in darwin internal linking PIE (which is the default) mode,
     8  // as dynamic export is not supported.
     9  
    10  package cgotest
    11  
    12  /*
    13  #include <stdint.h>
    14  #include <dlfcn.h>
    15  #cgo linux LDFLAGS: -ldl
    16  
    17  extern uintptr_t dlopen4029(char*, int);
    18  extern uintptr_t dlsym4029(uintptr_t, char*);
    19  extern int dlclose4029(uintptr_t);
    20  
    21  extern void call4029(uintptr_t arg);
    22  */
    23  import "C"
    24  
    25  import (
    26  	"testing"
    27  )
    28  
    29  var callbacks int
    30  
    31  //export IMPIsOpaque
    32  func IMPIsOpaque() {
    33  	callbacks++
    34  }
    35  
    36  //export IMPInitWithFrame
    37  func IMPInitWithFrame() {
    38  	callbacks++
    39  }
    40  
    41  //export IMPDrawRect
    42  func IMPDrawRect() {
    43  	callbacks++
    44  }
    45  
    46  //export IMPWindowResize
    47  func IMPWindowResize() {
    48  	callbacks++
    49  }
    50  
    51  func test4029(t *testing.T) {
    52  	loadThySelf(t, "IMPWindowResize")
    53  	loadThySelf(t, "IMPDrawRect")
    54  	loadThySelf(t, "IMPInitWithFrame")
    55  	loadThySelf(t, "IMPIsOpaque")
    56  	if callbacks != 4 {
    57  		t.Errorf("got %d callbacks, expected 4", callbacks)
    58  	}
    59  }
    60  
    61  func loadThySelf(t *testing.T, symbol string) {
    62  	this_process := C.dlopen4029(nil, C.RTLD_NOW)
    63  	if this_process == 0 {
    64  		t.Error("dlopen:", C.GoString(C.dlerror()))
    65  		return
    66  	}
    67  	defer C.dlclose4029(this_process)
    68  
    69  	symbol_address := C.dlsym4029(this_process, C.CString(symbol))
    70  	if symbol_address == 0 {
    71  		t.Error("dlsym:", C.GoString(C.dlerror()))
    72  		return
    73  	}
    74  	t.Log(symbol, symbol_address)
    75  	C.call4029(symbol_address)
    76  }