问题描述

使用在ECS上通过vsftpd建立的FTPserver,出现传输可执行文件时发生段错误的报错。

完整的流程是这样:我在ARM64的笔记本上build了一个项目,然后为了方便传输,直接将整个编译结果的文件夹传上了FTP server。在x86架构的Windows的设备上,我从FTP server上下载了编译结果,部署到了rk3588的开发板上(开发板的指令架构和ARM64的笔记本一致,出于嵌入式系统的最小化考虑,裁剪的linux上没有安装构建所需的工具包)。执行可执行文件时报错:segmentation fault ,段错误。

首先想的是不是编译的平台的问题,但是这种情况的报错一般不是这个,而是不适合的架构 Exec format error。 第二部考虑的就是ftp传输的问题。

解决方法

查阅资料以后发现,ftp具有两种文件传输的模式,一种是ASCII 模式、另一种是二进制模式来传输文件。ASCII 模式会对文件进行换行符转换(如将 \n 替换为 \r\n,LF和CRLF的问题),这对文本文件的处理有一定好处,但是会损坏二进制文件。可执行文件应该在二进制模式下传输。

FTP的server一般会自动的处理文件传输模式,也就是说问题取决于FTP客户端的设置,需要设置为二进制传输模式。

FileZella默认的是自动模式,偶尔会出现问题。 右上角-编辑-设置,在弹出窗口中选择 传输-FTP类型-二进制模式传输文件