关于glibc编译及getaddrinfo内存泄漏问题

在程序中发现getaddrinfo在进行协议无关(IPv4&IPv6)的DNS查询时内存泄漏问题,导致系统变慢,需要编译glibc定位问题。

首先要确定所编译的glibc版本对GCC版本以及工具链as、ld的版本要求(更新binuitls)。---这些很多人有描述,通过网络查找。

查找了一些资料,试过了很多个configure终于是编译通过了,如下:

./glibc/configure \
--build=i386-pc-linux-gnu \
--host=arm-brcm-linux-gnueabi \
--target=arm-brcm-linux-gnueabi \
CC=armv6jel-gcc \
CPP=armv6jel-cpp \
AR=armv6jel-ar \
RANLIB=armv6jel-ranlib \
STRIP=armv6jel-strip \
LD=armv6jel-ld \
NM=armv6jel-nm \
--enable-add-ons \
--disable-profile \
--disable-sanity-checks

最后定位到__nss_database_lookup()会内存泄露,当/etc目录下没有nsswitch.conf文件时会申请空间又没有释放导致的;因此可以通过增加nsswitch.conf或者修改代码。

1. 增加nsswitch.conf内容如下:
hosts:          dns [!UNAVAIL=return] files

2. 修改代码如下:
Index: b/sysdeps/posix/getaddrinfo.c
===================================================================
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
 
    if (__nss_hosts_database != NULL)
      {
        no_more = 0;
        nip = __nss_hosts_database;
      }
    else
-     no_more = __nss_database_lookup ("hosts", NULL,
-      "dns [!UNAVAIL=return] files",
-      &nip);
+     {
+       no_more = __nss_database_lookup ("hosts", NULL,
+        "dns [!UNAVAIL=return] files",
+        &__nss_hosts_database);
+       nip = __nss_hosts_database;
+     }

测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>

void getaddrinfo_test(void)
{
	int rc = 0;
	struct addrinfo *result = NULL;
	struct addrinfo *result_next;
	struct addrinfo hints;

	memset(&hints, 0, sizeof(hints));
	hints.ai_family = PF_UNSPEC;
	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_protocol = IPPROTO_UDP;

	rc = getaddrinfo("www.google.com", NULL, &hints, &result);
	
	if (rc)
	{
		freeaddrinfo(result);
		return;
	}

	result_next = result;
	while (result_next)
	{
		result_next = result_next->ai_next;
	}
	freeaddrinfo(result);
	return;
}

int main(int argc, char *argv[])
{
	printf("%hs %hs\n", __DATE__, __TIME__);

	while (1)
	{
		getaddrinfo_test();
		sleep(5);
	}

	return 0;
}

记录下,方便后来人查询。

==================================

查找了好多资料都没有发现相关glibc源码内存泄漏问题,在查找nsswitch.conf的具体作用时无意中发现已有人发现并提交了解决方案,BUG记录:https://sourceware.org/bugzilla/show_bug.cgi?id=15048


你可能感兴趣的:(关于glibc编译及getaddrinfo内存泄漏问题)