We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
当前不会自动执行obj所在package的init函数 package.init.x这些变量已经被加到符号表中,可以手动遍历执行所有的init函数 或者避免使用init函数,包裹为一个正常函数,在执行obj中代码之前手动调用该包裹函数 但是这样对于多package的场景不是很好处理,而且也不好保证每个init函数只被执行了一次(无法获取原二进制中是否import了对应的package,已经是否执行过,可能造成重复执行的场景)
或许可以参考go plugin的做法,获取当前package对应的package..inittask,使用go:linkname的方式拿到doInit函数,执行 doInit(&package..inittask) 。 package..inittask有状态字段标识是否已经执行过。
如果能正确重定向所需的符号,应该可以比较好的解决该问题。
package..inittask被加入到符号表中。我尝试了doInit(&package..inittask) 的方法, package..inittask当前应该不会走重定向流程,或许是其所依赖的package..inittask没有重定向正确,执行过程中会panic。
不过,当前场景不是刚需,有方式可以绕过,另外inittask这块的实现在不同的go版本中不相同,适配起来有些麻烦。 可以先讨论下对于init函数预期的行为? 在goloader.Load的时候是否自动执行其init函数
The text was updated successfully, but these errors were encountered:
a79a36e
fix #35, add support for package init
503cd75
639c724
No branches or pull requests
当前不会自动执行obj所在package的init函数
package.init.x这些变量已经被加到符号表中,可以手动遍历执行所有的init函数
或者避免使用init函数,包裹为一个正常函数,在执行obj中代码之前手动调用该包裹函数
但是这样对于多package的场景不是很好处理,而且也不好保证每个init函数只被执行了一次(无法获取原二进制中是否import了对应的package,已经是否执行过,可能造成重复执行的场景)
或许可以参考go plugin的做法,获取当前package对应的package..inittask,使用go:linkname的方式拿到doInit函数,执行
doInit(&package..inittask) 。 package..inittask有状态字段标识是否已经执行过。
如果能正确重定向所需的符号,应该可以比较好的解决该问题。
package..inittask被加入到符号表中。我尝试了doInit(&package..inittask) 的方法,
package..inittask当前应该不会走重定向流程,或许是其所依赖的package..inittask没有重定向正确,执行过程中会panic。
不过,当前场景不是刚需,有方式可以绕过,另外inittask这块的实现在不同的go版本中不相同,适配起来有些麻烦。
可以先讨论下对于init函数预期的行为? 在goloader.Load的时候是否自动执行其init函数
The text was updated successfully, but these errors were encountered: