Skip to content
New issue

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

init函数的处理 #35

Closed
WangLeonard opened this issue Jun 21, 2021 · 0 comments
Closed

init函数的处理 #35

WangLeonard opened this issue Jun 21, 2021 · 0 comments
Labels
enhancement New feature or request

Comments

@WangLeonard
Copy link

当前不会自动执行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函数

@pkujhd pkujhd added the enhancement New feature or request label Jun 22, 2021
@pkujhd pkujhd closed this as completed in a79a36e Jun 22, 2021
pkujhd added a commit that referenced this issue Jun 22, 2021
pkujhd added a commit that referenced this issue Jun 22, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants