FastNetMon

Thursday, 8 October 2015

Реалии использования динамических библиотек скомпилированных силами Go из С/С++

Всем известно, что начиная с версии 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»После этого фикса все стало работать решительно приличнее, но совершенно никаких гарантий, что так будет и впредь.

No comments :

Post a Comment

Note: only a member of this blog may post a comment.