Всем известно, что начиная с версии 1.5 Golang научился делать бинарные динамические .so библиотеки (go build -buildmode=c-shared -o libgobgp.so *.go), которые можно прилинковать к православному C коду.
Но если копнуть дальше, на деле это не совсем .so библиотека и привычного нам машинного кода там нету.
А есть обертки, которые вызывают код из Golang и подставляют себя С функциями.
Дада, Вы верно догадываетесь, Go's runtime запускается рядом. Не заметить это сложно - появляется 5ка тридов рядом с вашей программой Смайлик «smile»
Но это пол беды - этот рантайм запускается в момент запуска Вашего С-приложения, автоматически.
И если оно форкается или форкается и потом использует popen - горевать Вам очень долго, потому что многопоточное приложение, которым с момента запуска int main стал Ваш любимый софт из-за Go рантайма нельзя форкать, будет все крайне плохо Смайлик «smile»
Я даже молчу, что этот самый Го рантайм подменяет обработчики привычных нам сигналов и заворачивает их на себя, что может вызвать серьезный баттхерт у любителей поиграться с сигналами.
Как чинить? Линковаться динамически в рантайме, силами dlopen/dlsym, как сделал я - тут.
Вот так вот друзья - не все так просто, за все нужно платить Смайлик «smile»После этого фикса все стало работать решительно приличнее, но совершенно никаких гарантий, что так будет и впредь.
Но если копнуть дальше, на деле это не совсем .so библиотека и привычного нам машинного кода там нету.
А есть обертки, которые вызывают код из Golang и подставляют себя С функциями.
Дада, Вы верно догадываетесь, Go's runtime запускается рядом. Не заметить это сложно - появляется 5ка тридов рядом с вашей программой Смайлик «smile»
Но это пол беды - этот рантайм запускается в момент запуска Вашего С-приложения, автоматически.
И если оно форкается или форкается и потом использует popen - горевать Вам очень долго, потому что многопоточное приложение, которым с момента запуска int main стал Ваш любимый софт из-за Go рантайма нельзя форкать, будет все крайне плохо Смайлик «smile»
Я даже молчу, что этот самый Го рантайм подменяет обработчики привычных нам сигналов и заворачивает их на себя, что может вызвать серьезный баттхерт у любителей поиграться с сигналами.
Как чинить? Линковаться динамически в рантайме, силами dlopen/dlsym, как сделал я - тут.
Вот так вот друзья - не все так просто, за все нужно платить Смайлик «smile»После этого фикса все стало работать решительно приличнее, но совершенно никаких гарантий, что так будет и впредь.
No comments :
Post a Comment
Note: only a member of this blog may post a comment.