Git Product home page Git Product logo

Comments (11)

pkujhd avatar pkujhd commented on August 26, 2024

@yedemon , 可以打进一个包,具体你可以看go自己的编译过程,但是你依旧要制定所有的包的path,否则会查不到符号。

btw, 没必要这么干,如果你依赖了很多包,那这些包应该在loader里,而不是依赖在外边,就如你现在这个问题,你应该直接把basecontext编译进loader里. 保证你需要.o中要调用的函数在loader里都存在,那么在加载的时候不需要加载它

from goloader.

yedemon avatar yedemon commented on August 26, 2024

@yedemon , 可以打进一个包,具体你可以看go自己的编译过程,但是你依旧要制定所有的包的path,否则会查不到符号。

btw, 没必要这么干,如果你依赖了很多包,那这些包应该在loader里,而不是依赖在外边,就如你现在这个问题,你应该直接把basecontext编译进loader里. 保证你需要.o中要调用的函数在loader里都存在,那么在加载的时候不需要加载它

!大神手速真快,我再试试新版··· 嗯我也是在想把可以和loader放在一起的包都打进loader里,这样 .o 就可以直接用 loader 带的东西,但是我第一次尝试 basecontext 的时候,似乎读不到。我更新下再试试。

from goloader.

pkujhd avatar pkujhd commented on August 26, 2024

@yedemon , 可以打进一个包,具体你可以看go自己的编译过程,但是你依旧要制定所有的包的path,否则会查不到符号。
btw, 没必要这么干,如果你依赖了很多包,那这些包应该在loader里,而不是依赖在外边,就如你现在这个问题,你应该直接把basecontext编译进loader里. 保证你需要.o中要调用的函数在loader里都存在,那么在加载的时候不需要加载它

!大神手速真快,我再试试新版··· 嗯我也是在想把可以和loader放在一起的包都打进loader里,这样 .o 就可以直接用 loader 带的东西,但是我第一次尝试 basecontext 的时候,似乎读不到。我更新下再试试。

你的.o中使用的符号,需要在loader中被使用,这样loader在编译的过程中这个符号才存在

from goloader.

yedemon avatar yedemon commented on August 26, 2024

@yedemon , 可以打进一个包,具体你可以看go自己的编译过程,但是你依旧要制定所有的包的path,否则会查不到符号。
btw, 没必要这么干,如果你依赖了很多包,那这些包应该在loader里,而不是依赖在外边,就如你现在这个问题,你应该直接把basecontext编译进loader里. 保证你需要.o中要调用的函数在loader里都存在,那么在加载的时候不需要加载它

!大神手速真快,我再试试新版··· 嗯我也是在想把可以和loader放在一起的包都打进loader里,这样 .o 就可以直接用 loader 带的东西,但是我第一次尝试 basecontext 的时候,似乎读不到。我更新下再试试。

你的.o中使用的符号,需要在loader中被使用,这样loader在编译的过程中这个符号才存在

嗯,这个已经确认了,可以。但是好像需要把basecontext 里面所有的公开的方法都在 loader里面显式的引用一次。

现在唯一的一个问题就是,怎么做比较好?
目前正在探索和找。不知道大大有什么好的写法没有? 比如 import * 这样的简单的宏。或者有什么注释能让 go build 去主动保留一些没有被用到包(或者包的方法)

from goloader.

pkujhd avatar pkujhd commented on August 26, 2024

@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 avatar yedemon commented on August 26, 2024

@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.

yedemon avatar yedemon commented on August 26, 2024

求助, go 能否实现动态传递函数类型?

当我们从 库的符号里面 导出指针以后,能否动态转换成我们需要的函数?便于我们从参数里传入类型?

比如这样
var funcType = func(string) basecontext.ISContext
runFunc := *(*funcType)(unsafe.Pointer(&funcPtrContainer))

或者有什么好的建议么? 感谢哈··

from goloader.

pkujhd avatar pkujhd commented on August 26, 2024

求助, go 能否实现动态传递函数类型?

当我们从 库的符号里面 导出指针以后,能否动态转换成我们需要的函数?便于我们从参数里传入类型?

比如这样 var funcType = func(string) basecontext.ISContext runFunc := *(*funcType)(unsafe.Pointer(&funcPtrContainer))

或者有什么好的建议么? 感谢哈··

不了解你想干啥?函数的类型是确定的,不能随便修改,你调用的函数的函数签名是固定的,这是你在编写函数的时候就已经确定的了。

如果你想类似dl干活的话,参考dl就可以了。

from goloader.

yedemon avatar yedemon commented on August 26, 2024

嗯,这个我确实没想好哈·· 之前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.

pkujhd avatar pkujhd commented on August 26, 2024

嗯,这个我确实没想好哈·· 之前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.

eh-steve avatar eh-steve commented on August 26, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.