记录俩编译问题
今天碰到俩编译问题,记录一下。
问题1
编译使用了sigsetjmp的一个c文件,报错:
main.c:(.text+0x50): undefined reference to `sigsetjmp' collect2: error: ld returned 1 exit status make: *** [Makefile:2: all] Error 1
链接问题,那么应该是相关的库没装,但是又没找到相关的库,而且并非编译期出错,应该是有相关的库。用readelf,objdump等工具在动态库中找相关的symbol,有"__sigsetjmp"。初看以为就是这个,其实不然,加下划线和不加是不同的symbol。那么也就是头文件在定义sigsetjmp的时候有问题,果然发现有多个setjmp.h,其中/usr/include和/usr/local/inlclude各有一个,看了一个/usr/include/setjmp.h定义是
int sigsetjmp (sigjmp_buf, int) __setjmp_attr;
而/usr/setjmp.h是一个宏,
# define sigsetjmp(env, savemask) __sigsetjmp (env, savemask)
这就明显了,/usr/include/setjmp.h干扰了编译。简单将/usr/include/setjmp.h删除即可解决问题,但这么粗暴肯定不是什么好办法。
问题 2
编译一个go的项目报malloc的错:
xxxx: malloc.c:2617: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. SIGABRT: abort PC=0xffffbe15f200 m=0 sigcode=18446744073709551610 goroutine 0 [idle]: runtime: g 0: unknown pc 0xffffbe15f200 stack: frame={sp:0xffffdbf64b10, fp:0x0} stack=[0xffffdb765ff8,0xffffdbf65010)
看来go底层也是调用glic。但在升级了go编译器,验证了gcc,glibc之后就不知道如何查找问题。最后尝试删除go的cache解决了问题。但是仍然没有搞清楚问题的机理。只是得到一个经验,在检查问题之前先尽可能清理一下环境。
go对glibc的底层调用留作以后研究。