參考這一篇文章
然後結合自己實際操作過程中遇到的一些問題總結出來這個流程
所以把自己記得的流程記錄下來,結合網上一些文章總結,並將自己實際遇到的問題貼出來;
廢話少說
下面是具體流程:
我用的samba包是samba-3.5.9,交叉編譯工具包是arm-linux-gcc-4.4.3.tar.gz
首先解壓samba-3.5.9.tar.gz,進入到
samba-3.5.9
目錄下的source3目錄下
:~/programfiles$ cd samba-3.5.9/source3/
:~/programfiles/samba-3.5.9/source3$
source3/lib/system.c作修改4個函式
lib/system.c
中的4個函式
struct passwd *sys_getpwnam(const char *name)
struct passwd *sys_getpwuid(uid_t uid)
struct group *sys_getgrnam(const char *name)
struct group *sys_getgrgid(gid_t gid)
為了避免出錯,建議先備份system.檔案,或者像我這樣把原始四個函式注釋掉,然後新增修改後的函式,如下:
/*struct passwd *sys_getpwnam(const char *name)
struct passwd *sys_getpwuid(uid_t uid)
struct group *sys_getgrnam(const char *name)
struct group *sys_getgrgid(gid_t gid)
*/static struct passwd rootpw = ;
struct passwd *sys_getpwnam(const char *name)
struct passwd *sys_getpwuid(uid_t uid)
static char *rootmem = ;
static struct group rootgr = ;
struct group *sys_getgrnam(const char *name)
struct group *sys_getgrgid(gid_t gid)
然後在source3目錄下編寫交叉編譯的配置指令碼insatll:
#!/bin/bash
cross_compile=/home/sunfch/programfiles/opt/friendlyarm/toolschain/4.4.3/bin/arm-none-linux-gnueabi- //這個根據你自己解壓後交叉編譯工具的目錄,及選擇arm-none-linux-gnueabi-gcc 編譯,
runtime_dir=/data/data/samba
./configure \
cc="$cross_compile"gcc \
ar="$cross_compile"ar \
ld="$cross_compile"ld \
ranlib="$cross_compile"ranlib \
--host=i686 \
--target=arm-linux \
--disable-cups \
--disable-iprint \
--prefix=$runtime_dir \
--exec-prefix=$runtime_dir \
--with-logfilebase=$runtime_dir/var/log \
--with-swatdir=$runtime_dir/usr/local/swat \
--with-rootsbindir=$runtime_dir/sbin \
--with-lockdir=$runtime_dir/var/lock \
--with-piddir=$runtime_dir/var/lock \
--with-privatedir=$runtime_dir/etc/samba \
--with-configdir=$runtime_dir/etc/samba \
--cache-file=armsel-linux.cache \
--with-static-modules=vfs_fake_perms \
如果出現如下錯誤:
3.1 error: cannot run test program while cross compiling錯誤
checking that the c compiler understands negative enum values... configure: error: in `/root/samba-3.3.3/source':
configure: error: cannot run test program while cross compiling
解決:echo samba_cv_cc_negative_enum_values=yes>armsel-linux.cache
再一下執行指令碼
然後在source3目錄下執行:
make ldflags="-all-static -static"
上面這外是為把smbd, nmbd等編譯為靜態的。(不然在android上執行會出現 no such file or directory問題)
我在執行這一步遇到了以下錯誤:
error:file not recognized;file format not recognized
或者configure:error: require function not found
錯誤糾結了很長時間,最後才發現交叉編譯gcc版本問題,make distclean清除,將交叉編譯工具改為我上面說的工具,應該就沒問題了:
隨便在某個目錄下(能快速找到就行)建乙個smb.conf配置檔案,比如我直接在source3下
vim smb.conf
[global]
inte***ces = 192.168.0.103/24
workgroup = workgroup
server string = samba on android
netbios name = android
remote announce = 255.255.255.255
encrypt passwords = yes
security = user
#security = share
restrict anonymous = 1
load printers = no
printcap name = /dev/null
disable spoolss = yes
deadtime = 5
delete readonly = yes
nt acl support = no
inherit permissions = yes
socket options = so_sndbuf=16384 so_rcvbuf=16384
[test]
#vfs objects = fake_perms
comment = android /mnt/sdcard
#path = /mnt/sdcard
path = /data/data/samba/var/tmp
#path = /etc
force user = root
read only = no
writable = yes
#guest ok = no
browseable = yes
然後建立adb shell 進入到手機adb下
cd /data/data/
mkdir samba
cd samba
mkdir bin etc lib var
cd etc
mkdir samba
cd ../var
mkdir lock tmp log
資料夾建立完成後exit退出adb,然後在 source3目錄下
adb push smb.conf /data/data/samba/etc/samba //將smb.conf匯入手機/data/data/samba/etc/samba中
進入到bin目錄下:
adb push smbd /data/data/samba/bin
adb push smbpasswd /data/data/samba/bin
在adb下用
export tmpdir=/data/data/samba/var/tmp/ //設定tmpdir環境變數
bin/smbd -d 啟動samba服務,
bin/smbpasswd -a root 新增root使用者
你在tmp目錄下建立乙個目錄share,
然後在adb下用netcfg命令檢視手機ip 位址;
這時候你就可以通過windows下,用win+r鍵調出執行框
輸入\\192.168.0.103
就可輸入root和密碼,登入成功就可一看到share目錄
gloox移植到android平台
最近需要在android平台是使用gloox,官方gloox沒有沒有對應的android.mk檔案,那當然也可以用android ndk來編譯,但是我覺得用ndk編譯有點麻煩,就寫乙個android.mk來使用mm編譯。首先,進入src目錄,configure該專案 configure host a...
c 程式移植到android
在android 4.4之後新增了新的保護機制,可執行檔案必須是採用pie編譯的。如果是使用ndk進行編譯的 需要使用到android.mk指令碼 則在指令碼中新增 local cflags pie fpie local ldflags pie fpie 如果是手動採用交叉編譯鏈進行編譯的,則在編譯...
Linux程式移植到Android上
序言 由於本人還是比較偏重於先說明原理在說明實際操作步驟,要知其然更要知其所以然,如下圖所示 一般情況下,有兩種方法。1.乙個就是將程式靜態編譯,將程式中所有需要的庫全部編譯進可執行檔案中。這樣程式在android中執行就不需要鏈結任何動態庫了。但是帶來乙個非常大的弊端就是這個程式會非常大,資源利用...