Comments (11)
@yedemon , 可以打进一个包,具体你可以看go自己的编译过程,但是你依旧要制定所有的包的path,否则会查不到符号。
btw, 没必要这么干,如果你依赖了很多包,那这些包应该在loader里,而不是依赖在外边,就如你现在这个问题,你应该直接把basecontext编译进loader里. 保证你需要.o中要调用的函数在loader里都存在,那么在加载的时候不需要加载它
from goloader.
@yedemon , 可以打进一个包,具体你可以看go自己的编译过程,但是你依旧要制定所有的包的path,否则会查不到符号。
btw, 没必要这么干,如果你依赖了很多包,那这些包应该在loader里,而不是依赖在外边,就如你现在这个问题,你应该直接把basecontext编译进loader里. 保证你需要.o中要调用的函数在loader里都存在,那么在加载的时候不需要加载它
!大神手速真快,我再试试新版··· 嗯我也是在想把可以和loader放在一起的包都打进loader里,这样 .o 就可以直接用 loader 带的东西,但是我第一次尝试 basecontext 的时候,似乎读不到。我更新下再试试。
from goloader.
@yedemon , 可以打进一个包,具体你可以看go自己的编译过程,但是你依旧要制定所有的包的path,否则会查不到符号。
btw, 没必要这么干,如果你依赖了很多包,那这些包应该在loader里,而不是依赖在外边,就如你现在这个问题,你应该直接把basecontext编译进loader里. 保证你需要.o中要调用的函数在loader里都存在,那么在加载的时候不需要加载它!大神手速真快,我再试试新版··· 嗯我也是在想把可以和loader放在一起的包都打进loader里,这样 .o 就可以直接用 loader 带的东西,但是我第一次尝试 basecontext 的时候,似乎读不到。我更新下再试试。
你的.o中使用的符号,需要在loader中被使用,这样loader在编译的过程中这个符号才存在
from goloader.
@yedemon , 可以打进一个包,具体你可以看go自己的编译过程,但是你依旧要制定所有的包的path,否则会查不到符号。
btw, 没必要这么干,如果你依赖了很多包,那这些包应该在loader里,而不是依赖在外边,就如你现在这个问题,你应该直接把basecontext编译进loader里. 保证你需要.o中要调用的函数在loader里都存在,那么在加载的时候不需要加载它!大神手速真快,我再试试新版··· 嗯我也是在想把可以和loader放在一起的包都打进loader里,这样 .o 就可以直接用 loader 带的东西,但是我第一次尝试 basecontext 的时候,似乎读不到。我更新下再试试。
你的.o中使用的符号,需要在loader中被使用,这样loader在编译的过程中这个符号才存在
嗯,这个已经确认了,可以。但是好像需要把basecontext 里面所有的公开的方法都在 loader里面显式的引用一次。
现在唯一的一个问题就是,怎么做比较好?
目前正在探索和找。不知道大大有什么好的写法没有? 比如 import * 这样的简单的宏。或者有什么注释能让 go build 去主动保留一些没有被用到包(或者包的方法)
from goloader.
@yedemon , 可以打进一个包,具体你可以看go自己的编译过程,但是你依旧要制定所有的包的path,否则会查不到符号。
btw, 没必要这么干,如果你依赖了很多包,那这些包应该在loader里,而不是依赖在外边,就如你现在这个问题,你应该直接把basecontext编译进loader里. 保证你需要.o中要调用的函数在loader里都存在,那么在加载的时候不需要加载它!大神手速真快,我再试试新版··· 嗯我也是在想把可以和loader放在一起的包都打进loader里,这样 .o 就可以直接用 loader 带的东西,但是我第一次尝试 basecontext 的时候,似乎读不到。我更新下再试试。
你的.o中使用的符号,需要在loader中被使用,这样loader在编译的过程中这个符号才存在
嗯,这个已经确认了,可以。但是好像需要把basecontext 里面所有的公开的方法都在 loader里面显式的引用一次。
现在唯一的一个问题就是,怎么做比较好? 目前正在探索和找。不知道大大有什么好的写法没有? 比如 import * 这样的简单的宏。或者有什么注释能让 go build 去主动保留一些没有被用到包(或者包的方法)
这个不成,你只能调用goloader.regTypes来注册,这样函数就被保留了,如果你需要保留大量的函数,建议写个脚本生成下
from goloader.
@yedemon , 可以打进一个包,具体你可以看go自己的编译过程,但是你依旧要制定所有的包的path,否则会查不到符号。
btw, 没必要这么干,如果你依赖了很多包,那这些包应该在loader里,而不是依赖在外边,就如你现在这个问题,你应该直接把basecontext编译进loader里. 保证你需要.o中要调用的函数在loader里都存在,那么在加载的时候不需要加载它!大神手速真快,我再试试新版··· 嗯我也是在想把可以和loader放在一起的包都打进loader里,这样 .o 就可以直接用 loader 带的东西,但是我第一次尝试 basecontext 的时候,似乎读不到。我更新下再试试。
你的.o中使用的符号,需要在loader中被使用,这样loader在编译的过程中这个符号才存在
嗯,这个已经确认了,可以。但是好像需要把basecontext 里面所有的公开的方法都在 loader里面显式的引用一次。
现在唯一的一个问题就是,怎么做比较好? 目前正在探索和找。不知道大大有什么好的写法没有? 比如 import * 这样的简单的宏。或者有什么注释能让 go build 去主动保留一些没有被用到包(或者包的方法)这个不成,你只能调用goloader.regTypes来注册,这样函数就被保留了,如果你需要保留大量的函数,建议写个脚本生成下
奥·· 原来你这个 RegTypes 是干这个用的,多谢了。我再理一理~
from goloader.
求助, go 能否实现动态传递函数类型?
当我们从 库的符号里面 导出指针以后,能否动态转换成我们需要的函数?便于我们从参数里传入类型?
比如这样
var funcType = func(string) basecontext.ISContext
runFunc := *(*funcType)(unsafe.Pointer(&funcPtrContainer))
或者有什么好的建议么? 感谢哈··
from goloader.
求助, go 能否实现动态传递函数类型?
当我们从 库的符号里面 导出指针以后,能否动态转换成我们需要的函数?便于我们从参数里传入类型?
比如这样 var funcType = func(string) basecontext.ISContext runFunc := *(*funcType)(unsafe.Pointer(&funcPtrContainer))
或者有什么好的建议么? 感谢哈··
不了解你想干啥?函数的类型是确定的,不能随便修改,你调用的函数的函数签名是固定的,这是你在编写函数的时候就已经确定的了。
如果你想类似dl干活的话,参考dl就可以了。
from goloader.
嗯,这个我确实没想好哈·· 之前java 的思路用惯了,我本来想实现在同一个函数里实现给不同的地方的钩子添加回调函数,所以想把函数类型和回调列表作为参数传进来。在函数里面实现hook。类似
func (p *glPluginManager) Hook(callbacks []interface{}, functype ???, name string, funcName string) error {
glplugin, ok := p.pluginMap[name]
if !ok {
return errors.New("no plugin " + name)
}
runFuncPtr, ok := glplugin.codeModule.Syms["main."+funcName]
if !ok {
return fmt.Errorf("Load error! not find function: %s", funcName)
}
funcPtrContainer := (uintptr)(unsafe.Pointer(&runFuncPtr))
runFunc := *(*functype())unsafe.Pointer(&funcPtrContainer)
//???
return nil
}
后来我发现可以把那个 unsafe.Pointer 返回去,在需要Hook的地方直接转成那边的函数类型就可以了。
还是感谢大大回复:)
from goloader.
嗯,这个我确实没想好哈·· 之前java 的思路用惯了,我本来想实现在同一个函数里实现给不同的地方的钩子添加回调函数,所以想把函数类型和回调列表作为参数传进来。在函数里面实现hook。类似
func (p *glPluginManager) Hook(callbacks []interface{}, functype ???, name string, funcName string) error { glplugin, ok := p.pluginMap[name] if !ok { return errors.New("no plugin " + name) } runFuncPtr, ok := glplugin.codeModule.Syms["main."+funcName] if !ok { return fmt.Errorf("Load error! not find function: %s", funcName) } funcPtrContainer := (uintptr)(unsafe.Pointer(&runFuncPtr)) runFunc := *(*functype())unsafe.Pointer(&funcPtrContainer) //??? return nil }
后来我发现可以把那个 unsafe.Pointer 返回去,在需要Hook的地方直接转成那边的函数类型就可以了。
还是感谢大大回复:)
是的,调用者肯定明确知道需要调用的函数的签名
from goloader.
By the way, the JIT compiler in #66 adds in functionality to introspect the types of functions automatically, and build an eface
which contains this type information (in a map[string]interface{}
of Symbols), so it allows a safe type assertion/type switch (and even calling the function programmatically via reflect
!) instead of an unsafe pointer cast to a known type.
This is closer to the go compiler generating a ptab
which contains all this information, and is how the go plugin system provides type safety of plugin symbols.
See jit/jit_test.go
for some examples of the type assertion, and try changing the function signature to see what happens if the function signatures doesn't match (it safely fails the assertion, so you can easily type switch in the caller code)
from goloader.
Related Issues (20)
- Will panic soon when visit pprof web page HOT 7
- the handle of inline is incorrect HOT 11
- the usage of `copy2Slice` here seems to be incorrect, PutInt64 should be used instead HOT 30
- the `addfuncdata` rewrite `0` to `^uint32(0)`, but ignoring the case where 0 represents a normal offset value. HOT 5
- during module unloading, removing the itab can lead to runtime error HOT 1
- `getitab` alloc memory for `itab` by `persistentalloc`, and that couldnt be free HOT 6
- golang 1.21 support HOT 5
- 似乎不支援泛型 HOT 12
- `typelinksRegister` may bind wrong address when some types have same name at packages which also have same name HOT 3
- unexpected return pc 0x0 HOT 4
- Failed to execute plugin which contains dependency `unresolve external:<...>` HOT 2
- build constraints exclude all Go files in ... HOT 2
- there may be an omission of pcdata handling HOT 2
- go linker dont use ptrsize to align TEXT symbol
- may be a bug: the program handles the`findfunctab` does not consider the case where the function address spans 4kb HOT 2
- support golang 1.22 HOT 1
- Discussion on go plugin ecosystem HOT 3
- 内置接口类型 error 无法解析 HOT 5
- //go:linkname lock down future use HOT 2
- Support golang 1.23 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from goloader.