在64位ubuntu系统上运行mudos v22pre11
来源:互联网 发布:画图软件下载官方网站 编辑:程序博客网 时间:2024/05/17 22:29
几年前自己架过一个mud偶尔玩玩,mudos是v22pre11版本的,运行在32位的redhat上;前几天想跑起来耍耍,但目前都是64的ubuntu系统了,尝试将以便保存的mudos程序在ubuntu上运行,直接就出错退出了,segment fault。
把源码拿到ubuntu系统上重新编译,编出来的文件,也是一运行就直接退出了。
尝试安装redhat的虚拟机,是可以正常运行的,不过虚拟机占资源多,而且效率也低,不是最佳方案。抽了点时间尝试解决这个问题,发现导致退出的问题是在debug_message函数,输出调试信息的时候,debug_message支持可变参数,所以采用了va_start / va_arg / va_end三段论处理,但因为需要同时输出到console和log文件,所以vfprintf调用了两次;老的库函数是没有问题的,新版本的库函数的vfprintf调用是有副作用的,会破坏va_list,下次再对这个va_list调用的时候就会出错了;解决方法也很简单,用vsprintf输出到临时buffer,送给两个文件,就没有问题了。解决了这个问题mudos是可以起来了,但是mudlib还是不能用,用户可以连上,logon的时候就直接报错后关闭网络连接;尝试解决发现问题比较复杂,因为mudos是编译运行的,而mudlib是解释执行的,调试起来也非常不方便,而且即便解决了当前问题可能还会有更多的问题,代码比较多,也不想花太多精力在这上面。
看来必须要考虑更好的方案了,尝试了一下v22.2b14版本的mudos,也是各种问题;据说fluffos对64位系统的支持比较好,但是即便搞定了mudos,还可能存在mudlib的兼容性问题,整体工作量不好把握;看起来换mudos并不是非常有把握的方案。
想了一下,出现问题有两个可能的因素,一是32位系统和64位系统的兼容性问题,二是libc等函数库的版本兼容性问题,因为mudos采用动态编译,在ubuntu上执行时最终会调用到系统库对应的so文件,所以针对老版本库的写法在新版本下就可能出问题,比如上面提到的debug_message对可变参数的处理导致的问题;
这样解决方案就出来了,就是采用静态编译。到redhat虚拟机上,找到源码目录,修改GNUmakefile文件,找到CFLAGS=,改成CFLAGS=-static,指定静态编译,然后重新make,把得到的mudos拿到ubuntu上,就可以正常运行了。
经测试静态编译的mudos v22pre11可以在64位ubuntu上稳定运行,和32位redhat系统的表现并无差异。
- 在64位ubuntu系统上运行mudos v22pre11
- 如何在ubuntu 64 11.04 上运行32位程序
- dante-server在64位Ubuntu上无法运行解决方法
- 使IIS6运行在64位系统上
- 在64系统上运行32位DLL
- 解决32位Eclipse和64位Eclipse在64位win7系统上运行问题
- 解决32位Eclipse和64位Eclipse在64位win7系统上运行问题
- 解决32位Eclipse和64位Eclipse在64位win7系统上运行问题
- 在64位ubuntu系统上运作32位程序需要安装32位lib
- 检测windows 32位程序是否运行在64位系统上
- 32位的Web应用程序在64位的系统上运行
- 32位arm-linux-gcc无法在64位系统上运行
- 如何判断当前进程是在32位/64位系统上运行
- 在 64位Ubuntu系统上 建立32位编译环境
- 在ubuntu 14.04 64位系统上安装32位库
- Ubuntu 64位机器上运行32位程序
- 32位系统上开发的Access为数据库的程序在64位机器上运行出错的解决办法
- 在Ubuntu 64位OS上运行hadoop2.2.0[重新编译hadoop]
- 数学问题——哥德巴赫猜想
- java日志框架log4j详细配置及与slf4j联合使用教程
- 欢迎使用CSDN-markdown编辑器
- 杏树林公司面试
- VMware三种网络模式
- 在64位ubuntu系统上运行mudos v22pre11
- 64位weblogic11g安装
- LeetCode 521:Longest Uncommon Subsequence I (C++)
- 可变长度的刻度尺
- k8s-deployment
- 自己写的一个存储过程
- redis集群
- poj 1007实现感想
- git常用命令总结