最近有个需求,要在go中调用yara,发现官方的go-yara跨平台做的不是很好,于是决定在go中直接调用外部yara程序,这样只需要写一份代码在windows和linux上都能用了。
发现官方只提供了windows的发布程序,linux需要自行编译或者apt yum 安装,但是用户的环境中没有网,无法apt yum,所以只剩下两条路,让用户自己编译yara或者我先编译好再与go程序一起发布。想想第一种方案其实是不可能的,因为编译yara需要许多工具,也是需要下载的:
sudo apt-get install automake libtool make gcc pkg-config
于是只剩下最后一个方法,自己编译yara。这里就遇到困难了,按照官方编译教程:
./bootstrap.sh
./configure
make
编译出来的yara是动态链接的,比如我在ubuntu编译好,拿到centos是无法运行的,缺库。windows只要将需要的dll和exe放在一个目录下就行了,linux却不是这样。
反正就挺折腾的,网上说gcc静态编译出来的程序不是真正的静态编译,可能要换musl之类的编译器才行,这里又因为yara用了configure自动生成makefile,我又不会makefile,就很头大。但是不管怎样现在问题暂时解决了,我在ubuntu编译出yara,file 看是静态链接的,拿到centos也能用,暂时没发现什么异常,所以我就把现在这个可能不是很完美的解决方案记录下来:
如果安装官方的方法编译,出来的程序是 dynamic linked 的。那么应该怎么改呢,参考这篇文章:
https://stackoverflow.com/questions/20068947/how-to-static-link-linux-software-that-uses-configure
所以只需要执行下面的命令就好了:
./bootstrap.sh
./configure CFLAGS="-static"
make LDFLAGS="-all-static"
给 configure 和 make 都加上 static 的要求就行了,这有个前提,项目必须包含 libtool 这玩意,yara是符合要求的。