免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 23043 | 回复: 12
打印 上一主题 下一主题

[C] 静态编译问题:warning: Using 'getaddrinfo' in statically linked ... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-25 10:12 |只看该作者 |倒序浏览
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netdb.h>

  5. int main(int argc, char *argv[])
  6. {
  7.         struct addrinfo hints;
  8.         struct addrinfo *result;

  9.         getaddrinfo(NULL, argv[1], &hints, &result);       
  10. }
复制代码
编译命令:
gcc -static a.c

In function `main':
a.c.text+0x2d): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

论坛徽章:
0
2 [报告]
发表于 2010-11-25 11:19 |只看该作者
刚看了下solaris平台的man getaddrinfo
cc [ flag... ] file ... -lsocket  -lnsl  [ library ... ]

修改编译命令(ubuntu-10.04):
gcc -static a.c -lsocket -lnsl
/usr/bin/ld: cannot find -lsocket
/tmp/ccJgnvKd.o: In function `main':
a.c.text+0x2d): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
collect2: ld returned 1 exit status

gcc -static a.c -lnsl
/tmp/cc5o1PBe.o: In function `main':
a.c.text+0x2d): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

这个函数需要链接那个库文件呢?

论坛徽章:
0
3 [报告]
发表于 2010-11-25 12:26 |只看该作者
链接已经成功了,只不过不建议用 -static

论坛徽章:
0
4 [报告]
发表于 2010-11-25 12:49 |只看该作者
编译命令:
gcc -static a.c

In function `main':
a.c.text+0x2d): warning: Using 'getaddrinfo'  ...
veking 发表于 2010-11-25 10:12



    它说的意思getaddrinfo在动态库中,却用static的方式链接了。

论坛徽章:
0
5 [报告]
发表于 2010-11-25 13:05 |只看该作者
链接已经成功了,只不过不建议用 -static
drangon 发表于 2010-11-25 12:26



    4楼的解释比较合理

论坛徽章:
0
6 [报告]
发表于 2010-11-25 13:08 |只看该作者
它说的意思getaddrinfo在动态库中,却用static的方式链接了。
lnitcscq 发表于 2010-11-25 12:49



    用readelf 查看getaddrinfo是UND类型,在lib路径搜索
grep getaddrinfo /usr/lib/*.a
二进制文件 libanl.a 匹配
二进制文件 libc.a 匹配
二进制文件 libcups.a 匹配
二进制文件 libgio-2.0.a 匹配
二进制文件 libICE.a 匹配
二进制文件 libX11.a 匹配
二进制文件 libxcb.a 匹配

这些只有libc.a是FUNCTION类型,但是链接这个库后也是那个警告提示。

论坛徽章:
0
7 [报告]
发表于 2010-11-25 17:27 |只看该作者
没人知道吗?

论坛徽章:
0
8 [报告]
发表于 2010-11-25 22:13 |只看该作者
没人知道吗?
veking 发表于 2010-11-25 17:27



    /* Warning for linking functions calling dlopen into static binaries.  */
#ifdef SHARED
#define static_link_warning(name)
#else
#define static_link_warning(name) static_link_warning1(name)
#define static_link_warning1(name) \
  link_warning(name, "Using '" #name "' in statically linked applications \
requires at runtime the shared libraries from the glibc version used \
for linking")
#endif



static_link_warning (getaddrinfo)



显示的使用dlopen的代码(或者使用这种库,库使用dlopen, 比如NSS库(具体为什么要显示dlopen我没研究过,总之有一定原因吧))
-static的时候dlopen函数的代码会被编译到a.out里面
当该a.out在本机跑的时候没有问题,因为dlopen和相应的动态库格式是相互了解的,但是如果在一个别的系统上
执行dlopen时,很可能出错

就是说本来static是为了随便拿到别的机器跑,而可能发生错误(甚至莫名奇妙的错误,我现实中遇到过,几乎没法调试,以前还不知道原因)
所以有个警告

论坛徽章:
0
9 [报告]
发表于 2010-11-26 08:56 |只看该作者
出现这个问题是因为链接libevent.a引起的,还是没搞明白啊。

libevent-1.4.13-stable/http.c:2740: warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

论坛徽章:
0
10 [报告]
发表于 2010-11-26 14:30 |只看该作者
出现这个问题是因为链接libevent.a引起的,还是没搞明白啊。

libevent-1.4.13-stable/http.c:2740: warn ...
veking 发表于 2010-11-26 08:56



没搞明白什么?
你应该是想问为什么会有警告吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP