使用函数 gethostbyname 编译 C 到静态链接错误

2024-04-12

我正在尝试使用函数编译程序gethostbyname()使用交叉编译器arm-none-linux-gnueabi,但是当我在 android 上运行我的二进制文件时它不起作用。

我的代码如下:

  /* gethostbyname-example.c */

  #include <stdio.h>
  #include <unistd.h>
  #include <stdlib.h>
  #include <string.h>
  #include <errno.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <netdb.h>

  extern int h_errno;

  int main(int argc,char **argv) {
     int x, x2;
     struct hostent *hp;

     for ( x=1; x<argc; ++x ) {
        hp = gethostbyname(argv[x]);
        if ( !hp ) {
           fprintf(stderr,
                   "%s: host '%s'\n",
                   hstrerror(h_errno),
                   argv[x]);
           continue;
        }

        printf("Host %s : \n" ,argv[x]);
        printf(" Officially:\t%s\n", hp->h_name);
        fputs(" Aliases:\t",stdout);
        for ( x2=0; hp->h_aliases[x2]; ++x2 ) {
           if ( x2 ) {
              fputs(", ",stdout);
             }
        fputs(hp->h_aliases[x2],stdout);
        }     
        fputc('\n',stdout);
        printf(" Type:\t\t%s\n",
               hp->h_addrtype == AF_INET
               ? "AF_INET" : "AF_INET6");
        if ( hp->h_addrtype == AF_INET ) {
           for ( x2=0; hp->h_addr_list[x2]; ++x2 ) {
              printf(" Address:\t%s\n",
                     inet_ntoa( *(struct in_addr *)
                      hp->h_addr_list[x2]));
           }
        }
     putchar('\n');
     }
     return 0;
  }

我编译用arm-none-linux-gnueabi-gcc, 在我的带有操作系统的笔记本电脑上ubuntu 12.04和交叉编译器Sourcery Codebench:

$ arm-none-linux-gnueabi-gcc gethostbyname-example.c --static -o gethostbyname-example
/tmp/ccE0xjBG.o: In function `main':
lookup.c:(.text+0x38): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
$ ls
gethostbyname-example.c gethostbyname-example
$ file gethostbyname-example
gethostbyname-example: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped

然后我测试二进制文件gethostbyname-example在我的 chroot 手臂上,我将二进制文件复制粘贴到chroot文件夹,然后我登录到chroot,然后我执行,顺便说一句,我从这里进行 chroothttps://wiki.ubuntu.com/ARM/BuildEABIChroot https://wiki.ubuntu.com/ARM/BuildEABIChroot,如果我在 chroot 上运行它,我得到的结果如下:

# ./gethostbyname-example www.google.com
Host google.com : 
 Officially:    www.google.com
 Aliases:   
 Type:      AF_INET
 Address:   74.125.135.139
 Address:   74.125.135.100
 Address:   74.125.135.101
 Address:   74.125.135.102
 Address:   74.125.135.113
 Address:   74.125.135.138

然后我还使用 adb Push 上传二进制 gethostbyname-example 到我的 Android 设备,如果我运行二进制 gethostbyname-example,我会收到如下错误:

# ./gethostbyname-example www.google.com
# Unknown server error: host 'www.google.com'
# ping www.google.com
# PING www.google.com (74.125.135.99) 56(84) bytes of data.
# 64 bytes from ni-in-f99.1e100.net (74.125.135.99): icmp_seq=1 ttl=49 time=798 ms
# 64 bytes from ni-in-f99.1e100.net (74.125.135.99): icmp_seq=2 ttl=49 time=1039 ms

在我的 Android 设备中,我在 /etc/ 和 /system/etc/ 中有一个带有 google DNS 的文件主机

8.8.8.8 
8.8.4.4

大概是什么原因造成这个故障,

谢谢。


简短说明

glibc 中的 DNS 查找需要 /lib/libnss_dns.so.2 ,这在 Android 上不可用。

另一个区别是 Android 存储 DNS 设置/system/etc/resolv.conf,使用仿生 C 库构建的本机 Android 应用程序将在那里查找要查询的 DNS 服务器。使用 glibc 构建的应用程序将查找/etc/resolv.conf,Android 上不存在。

更长的解释

您已使用 glibc 构建了二进制文件,而 Android 使用仿生 C 库。

当静态链接到 libc 时,这在大多数情况下应该没问题,因为我不知道 android 内核中有足够严重的更改来破坏简单的用户应用程序。不过,您应该使用 Android NDK 来构建 Android 本机应用程序,

然而,静态链接到 glibc 时会出现一些问题。 glibc 中的某些函数,例如用于查找用户信息、主机名和通常在 /etc/nsswitch.conf 中配置的其他内容,调用其他共享库来实际完成这项工作。无论您是否静态链接到 glibc 本身,都会发生这种情况。这些文件通常是 glibc 系统上的 /lib/libnss_* 文件。

大多数共享库都是 glibc 的一部分,并且将安装在 glibc 系统上。但它们在 Android 上不可用。当这些共享库可用时,依赖使用这些辅助共享库的函数的应用程序无法正常工作 - gethostbyname() 就是其中之一,对于正常的 DNS 查询,它需要 /lib/libnss_dns.so.2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用函数 gethostbyname 编译 C 到静态链接错误 的相关文章

  • 使用 UPI url 调用 PSP 应用程序

    我正在尝试创建一个商家应用程序 它将根据 NPCI 的指南生成一个 url 此 url 将作为意图共享 并且 PSP 应用程序 任何注册的银行应用程序 应该能够侦听该 url 并被调用 我已经形成了这样的网址 upi pay pa icic
  • 带有运算符语法的错误消息,但不带有函数语法的错误消息

    为什么我在调用 unary 时收到错误消息 使用运算符语法 如果我用函数语法调用它就可以了 现场演示 https godbolt org z j7AbeQ template
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 如何更改 Android 12 启动屏幕中的图标形状?

    我想要矩形形状的启动屏幕图标 而不是 android 12 中的圆形形状 我不相信你可以 如果你看这里的第 3 点 https developer android com about versions 12 features splash
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 使用后退按钮启动 Activity

    我正在 Android 中开发一个应用程序 我正在寻找解决方案 有一个活动 例如 A1 通过单击按钮 用户可以转到另一个活动 例如 A2 现在 一旦用户完成 A2 活动 他就会单击后退按钮 返回到上一个活动 A1 这是众所周知的事实 A1此
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 从Android客户端登录appengine

    我正在尝试登录应用程序引擎并访问应用程序引擎中的用户服务API 基本上我希望能够看到谁登录了我的 servlet 我正在使用从 android 获取 authtoken 然后从应用程序引擎获取 ASID 或 SACID cookie 的身份
  • 如何在 onDraw() 方法中定义与像素无关的高度

    我扩展了 View 来构建自定义小部件 我想用独立的像素单位定义小部件的高度 我认为可以通过将像素密度乘以所需的高度来完成 但我不知道该怎么做 到目前为止我所拥有的 最小化 public class Timeline extends Vie
  • 将 Crashlytics 集成到图书馆项目

    我有一个图书馆项目 自定义视图库项目 它没有任何活动 服务 我想将 Crashlytics SDK 集成到我的库中 当我尝试通过 Android Studio 的 Crashlytics 插件 工具栏中的图标 添加它时 它只是停留在 Che
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService
  • 使用 RecyclerView.Adapter 在 onBindViewHolder() 内设置 onItemClickListener

    我有一个自定义对象 学生班 public class Student private String name private String age public String getName return name public void
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 制作弹跳动画

    我想做图层的弹跳动画 我已经完成了该图层从右到中心的操作 现在我想将其向后移动一点 然后回到中心 这会产生反弹效果 我想我可以用这样的翻译来做到这一点
  • 这种尺寸对齐是如何工作的

    对于所提供的评论 我无法理解以下代码 这段代码的作用是什么 以及等效的代码是什么8 aligned segment size must be 4 aligned attr gt options ssize 3 Here ssize is o
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐

  • 通过处理 NC_HITTEST 移动控件时设置 SizeAll 光标

    我写了WndProc可移动控件的方法如下 protected override void WndProc ref Message m const int WM NCHITTEST 0x0084 if m Msg WM NCHITTEST b
  • ios::noreplace 的 C++ 替换

    我正在使用 fstream 打开文件进行写入 我不想覆盖现有文件 因此经过一番搜索后 我发现了 ios noreplace 但是当我编译这个时 include
  • sklearn“管道实例尚未安装。”错误,尽管它是

    已经提出了类似的问题 但答案并没有帮助我解决我的问题 即使整个管道都安装了 管道中的 Sklearn 组件也没有安装 https stackoverflow com questions 58704347 sklearn components
  • 雄辩的 MYSQL 语句:WHERE NOT(A OR B)

    我正在开发日期范围重叠功能 可以用 13 个正条件编写该功能来检查日期间隔是否重叠 https en wikipedia org wiki Allen 27s interval algebra https en wikipedia org
  • 播放音频并单击重新启动

    我正在寻找在 HTML5 音频播放器中重新启动音频文件 我定义了一个音频文件和一个play button
  • Python 中的自动 ARIMA 导致趋势拟合预测不佳

    ARIMA 新手 尝试使用自动 ARIMA 在 Python 中对数据集进行建模 我正在使用 auto ARIMA 因为我相信它会更好地定义 p d 和 q 的值 但结果很差 我需要一些指导 请参阅下面我的可重复尝试 尝试如下 DEPEND
  • 如何在标题和桑基图之间添加更多空间?

    我使用 python 和plotly 来创建桑基图 这是标题 副标题的文本和问题的图片 标题与图表重叠 如何在两者之间创造更多空间 我尝试在布局中添加 height 但这会改变我的桑基图的宽度 line2 From time str tim
  • PHPMyAdmin 中没有结果

    使用 Mysql 控制台 set Name CONCAT seq 0 to DATEDIFF 2015 12 15 2015 12 05 1 Query OK 0 rows affected 0 00 sec MariaDB test gt
  • 使用 COM 对象的 Python ctypes 和 DLL

    在 Windows 下 我尝试使用第 3 方 DLL SomeLib dll 使用 Python 2 7 用 C 编程ctypes 对于其某些功能 该库使用另一个 COM DLL SomeCOMlib dll 它本身使用其他DLL LibA
  • 在 CONNECT-BY 查询中未获得完整的系列乘法(乘积)

    我有一个 CONNECT BY 查询 但没有得到所需的结果 最终的子查询和查询应该产生一串百分比相乘的乘积 它首先列出了每年的保留百分比 PCT 随着查询的进行 它应该将第一年的 PCT 乘以下一年的 PCT 依此类推 直到达到所需的深度
  • 在 Windows 上哪里可以获得 gccxml 的编译版本?

    谁能指出一个可以在 Windows 上获取 gccxml 编译版本的地方 更高版本可以在这里找到 http sourceforge net projects pygccxml files gccxml setup http sourcefo
  • Javascript For循环回调?

    尝试用 Javascript 而不是 jQuery 来思考 所以我想知道我这样做是否正确 我想在循环完成时进行回调 这是正确的方法吗 for var i 0 i lt divs length i do some stuff if i div
  • 更新 SSIS OLEDB 目标中的行

    我有一个数据流过程 其中有一个 OLEDB 源和一个 OLEDB 目标 如下所示 源合并来自两个临时表的数据并返回结果集 例如 50K 行 这 50K 行也存在于目标表中 但是旧数据 SELECT FROM staging1 UNION S
  • R knit Markdown:For 循环内的输出图

    我想创建一个自动针织报告 它将为我的数据框中的每个数字字段生成直方图 我的目标是在无需指定实际字段的情况下完成此操作 此数据集包含超过 70 个字段 我还想重用该脚本 我尝试了几种不同的方法 saving the plot to an ob
  • 我可以将虚拟机放入可用性集之外的另一个资源组吗?

    我希望将每个虚拟机保留在单独的资源组中 以便于生命周期管理 我有一个包含 n 个 VLM 的集群 因此 我为公共 IP 负载均衡器等常见事物创建一个资源组 并将可用性集声明放入其中 因为它也必须在虚拟机之间共享 然后我在单独的资源组中创建虚
  • Perl 代码中的错误:无法找到模块 XML::LibXSLT 的可加载对象 [重复]

    这个问题在这里已经有答案了 Environment CentOS 5 Application Perl 5 8 8 Apache 错误说 Error in Perl code Can t locate loadable object for
  • Spring Boot Maven - 包含本机库

    在我的项目中我正在使用Sigar需要一些本机库的库 我想将所有文件 ddl so 等 特定于平台的 包含在 JAR 内或运行 jar 的同一目录中 Sigar在 java library 路径中搜索这个库 但我无法将它们全部包含在系统中PA
  • 如何向 JCarousel 添加描述

    我在用jcarousel 我无法为滑块中的照片添加描述 div ul class jcarousel skin tango li img src images about img1 jpg li ul div 您可以在 jCarousel
  • 是什么导致 MSSQL 中出现“非阻塞套接字上的操作将阻塞”错误?

    错误 异常查询为 CREATE NONCLUSTERED INDEX I1 ON AllAccounts BAK Master received Day ASC 出现异常 发生一个或多个错误 错误 异常内部异常无法从传输连接读取数据 非阻塞
  • 使用函数 gethostbyname 编译 C 到静态链接错误

    我正在尝试使用函数编译程序gethostbyname 使用交叉编译器arm none linux gnueabi 但是当我在 android 上运行我的二进制文件时它不起作用 我的代码如下 gethostbyname example c i