9. php extension loading process
1. load shared library (.so / .dll)
2. fetch “get_module” or
“_get_module” symbol
3. call fetched function and get
pointer to zend_module_entry
structure
4. register module using the
zend_module_entry
ref:php_load_extension in ext/standard/dl.c
10. export get_module
package main
/*
#include “php.h”
*/
import “C”
var gophp_module_entry C.zend_module_entry
//export get_module
func get_module() *C.zend_module_entry {
gophp_module_entry.name = C.Cstring(“gophp”)
gophp_module_entry.functions = …
// fill member in gophp_module_entry
return gophp_module_entry;
}
11. export get_module
package main
/*
#include “php.h”
*/
import “C”
var gophp_module_entry C.zend_module_entry
//export get_module
func get_module() *C.zend_module_entry {
gophp_module_entry.name = C.Cstring(“gophp”)
gophp_module_entry.functions = …
// fill member in gophp_module_entry
return gophp_module_entry;
}
13. separate export function and
function definition
• err: multiple definition of ` xxx'
• write definition in non_export.go
(not include //export)
• write declarations in export.go
(include //export)
• go build non_export.go export.go
15. but,but,but
• segmentation fault in shutdown
process sometimes……
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffee4c2700 (LWP 8943)]
0x00007ffff04d6821 in ?? ()
(gdb) backtrace
#0 0x00007ffff04d6821 in ?? ()
#1 0x00007ffff04a6213 in ?? ()
#2 0x000000c82002ce90 in ?? ()
#3 0x0000000000000000 in ?? ()
in go runtime? Umm…