探究64位Linux系统下32位程序的兼容性问题——以OpenVPN为例
作者:客官真的真的不可以 | 来源:互联网 | 2024-11-20 16:34
本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。
在进行OpenVPN程序的远程调试时,遇到了一些棘手的问题,例如客户端成功连接服务器并分配了虚拟IP地址,但tap设备未能按预期工作。具体表现为tap设备名称显示为空,而非预期的'tap0'。为简化问题,编写了一个专门用于创建tap设备的测试代码,如下所示:
```c
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
struct ifreq ifr;
int fd, err;
const char *clOnedev= "/dev/net/tun";
if ((fd = open(clonedev, O_RDWR)) <0) {
perror("Opening /dev/net/tun");
return -1;
}
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
printf("Before IOCTL: %s\n", ifr.ifr_name);
if ((err = ioctl(fd, TUNSETIFF, (void *)&ifr)) <0) {
perror("ioctl(TUNSETIFF)");
close(fd);
return -1;
}
printf("After IOCTL: %s\n", ifr.ifr_name);
close(fd);
return 0;
}
```
该代码在本地32位系统上编译运行正常,能够正确创建并显示tap设备名称。但在64位系统上运行时,尽管系统已安装了必要的32位库,tap设备名称仍无法正确显示。
经过进一步调查,发现问题是由于64位系统对32位程序的兼容机制存在缺陷。具体来说,当32位程序在64位系统上调用`ioctl`时,内核会通过`compat_sys_ioctl`函数来处理。对于`TUNSETIFF`命令,内核应该通过`dev_ifsioc`函数来处理,但实际的实现中,`dev_ifsioc`并未正确处理`TUNSETIFF`命令,导致tap设备名称未能正确传递回用户空间。
通过分析内核源码,特别是`drivers/net/tun.c`文件中的`tun_chr_ioctl`函数,发现了`HANDLE_IOCTL(TUNSETIFF, dev_ifsioc)`这一行代码。这表明内核试图通过`dev_ifsioc`来处理`TUNSETIFF`命令,但由于`dev_ifsioc`中缺少相应的处理逻辑,导致了问题的发生。
最终,通过在`dev_ifsioc`函数中添加对`TUNSETIFF`命令的处理逻辑,解决了这一兼容性问题。这一发现不仅有助于解决当前的问题,也为类似情况下的故障排除提供了参考。
推荐阅读
-
目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ...
[详细]
蜡笔小新 2024-11-20 15:21:14
-
c语言二元插值,二维线性插值c语言 ...
[详细]
蜡笔小新 2024-11-20 12:20:16
-
-
实现系统调用一、实验环境本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标通过对上述实验原理的认识,相信 ...
[详细]
蜡笔小新 2024-11-19 17:13:33
-
线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ...
[详细]
蜡笔小新 2024-11-18 14:56:11
-
本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ...
[详细]
蜡笔小新 2024-11-20 17:39:42
-
本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ...
[详细]
蜡笔小新 2024-11-20 14:35:41
-
本文详细介绍了如何在循环双链表的指定位置插入新元素的方法,包括必要的步骤和代码示例。 ...
[详细]
蜡笔小新 2024-11-20 06:48:26
-
本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ...
[详细]
蜡笔小新 2024-11-19 20:00:19
-
本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ...
[详细]
蜡笔小新 2024-11-19 14:44:19
-
mysql数据库json类型数据,sql server json数据类型 ...
[详细]
蜡笔小新 2024-11-19 11:05:28
-
题目描述:计算从起点到终点的最小能量消耗。如果下一个单元格的风向与当前单元格相同,则消耗为0,否则为1。共有8个可能的方向。 ...
[详细]
蜡笔小新 2024-11-18 16:02:40
-
本文详细介绍了C语言中的结构体,包括结构体的声明、初始化、成员访问以及传参等方面的知识。 ...
[详细]
蜡笔小新 2024-11-17 19:31:06
-
首部|接口类型_OSI 7层模型 & TCP/IP协议首部封装格式解析 ...
[详细]
蜡笔小新 2024-11-17 18:56:46
-
本文详细探讨了Spring框架中遇到的NoSuchBeanDefinitionException异常,具体涉及com.thinkplatform.dao.UserLogDao Bean未定义的问题,并提供了相应的解决方案。 ...
[详细]
蜡笔小新 2024-11-17 17:16:33
-
在构建 Caffe 时,可能会遇到与 Protobuf 版本不兼容导致的链接错误。本文将详细介绍这些错误及其解决方案。 ...
[详细]
蜡笔小新 2024-11-17 14:27:34
-