记录俩编译问题

今天碰到俩编译问题,记录一下。

问题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的底层调用留作以后研究。

posted @ 2023-10-11 21:48  半山随笔  阅读(122)  评论(0编辑  收藏  举报