數位天堂

Nokia:科技始終來自於人性; 拜耳:如果文明不能使我們更相愛,那科技便失去意義!
歡迎您的加入,讓我們一起討論科技與環保的整合應用...

您尚未登入。

#1 2008-10-23 14:38:24

James
新生
註冊日期: 2008-10-17
文章數: 31
目前積分 :   

如何判斷平台支不支援Large file

在ASUS WL-500gP平台上執行程式時
出現can't resolve symobl 'fstat64'
一開始並不清楚它是什麼錯誤,可能只是缺那一個程式庫之類的
後來發現原來系統不支援「Large file」。

我有沒有辦法,拿到平台或系統的時候就知道它支不支援「Large file」

Large file support wiki:http://en.wikipedia.org/wiki/Large_file_support




離線

 

#2 2008-10-23 16:08:27

hippo
天使
註冊日期: 2008-10-07
文章數: 1562
目前積分 :   20 

Re: 如何判斷平台支不支援Large file

1. can't resolve symobl 'fstat64' 是uClibc呼叫錯誤, 如果您仔細檢查, 會發現至少三種不同的library. 載入正確的library即可.
2. 以磁碟格式來說, 在FAT, FAT32不支援; ext2, ext3沒有大檔案限制這樣的問題.
3. 4, 8, 16bit的CPU, 大檔案甭談; 32, 64bit要看您執行哪種模式的操作系統來決定是否支援大檔案.



離線

 

#3 2008-10-23 16:14:15

James
新生
註冊日期: 2008-10-17
文章數: 31
目前積分 :   

Re: 如何判斷平台支不支援Large file

因為我使用sqlite3,所以我安裝sqlite3的ipk之後,執行時出現"can't resolve symobl 'fstat64'"
於是我自己下載sqlite3的tarball自行編譯,並且disable sqlite3的「Large File Support」,並將shared library放到平台上
執行之後就不再出現「can't resolve symobl 'fstat64'」

話說,「如果您仔細檢查, 會發現至少三種不同的library. 載入正確的library即可」,不曉得大大你怎麼檢查的?grin

另外,以磁碟格式來毒,如何得知系統的磁碟格式呢?有什麼指令可以得知呢?big_smile

不好意思,一直問問題smile


離線

 

#4 2008-10-23 16:43:21

hippo
天使
註冊日期: 2008-10-07
文章數: 1562
目前積分 :   20 

Re: 如何判斷平台支不支援Large file

James 提到:

因為我使用sqlite3,所以我安裝sqlite3的ipk之後,執行時出現"can't resolve symobl 'fstat64'"
於是我自己下載sqlite3的tarball自行編譯,並且disable sqlite3的「Large File Support」,並將shared library放到平台上
執行之後就不再出現「can't resolve symobl 'fstat64'」

話說,「如果您仔細檢查, 會發現至少三種不同的library. 載入正確的library即可」,不曉得大大你怎麼檢查的?grin

另外,以磁碟格式來毒,如何得知系統的磁碟格式呢?有什麼指令可以得知呢?big_smile

不好意思,一直問問題smile

1. OpenWrt, Optware內都有SQLite3, 但使用不同library.
2. 好樣的, 會找source自行編譯. SQLite3可正常運作嗎? 是否有run time error?
3. find / -name *uClibc*
4. mount
多問多健康, 沒事多喝水.pepsi


離線

 

#5 2008-10-23 16:57:25

James
新生
註冊日期: 2008-10-17
文章數: 31
目前積分 :   

Re: 如何判斷平台支不支援Large file

http://ipkg.nslu2-linux.org/feeds/optwa … ss/stable/
http://ipkg.nslu2-linux.org/feeds/optwa … oss/stable
我是有在這裡找到oleg、ddwrt的ipk packages,裡面都有sqlite3,但就之前說的,我執行會發生"can't resolve symobl 'fstat64'"

自己編譯,執行也ok唷!因為我有將平台上的libs做更新。

mount的話,你應該是指 mout -o bind /jffs/opt /opt
而且mount之後,還要加上以下這二個export,對吧!
export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/jffs/sbin:/jffs/bin:/jffs/usr/sbin:/jffs/usr/bin:/jffs/opt/bin
export LD_LIBRARY_PATH=/lib:/usr/lib:/jffs/opt/lib:/jffs/lib:/jffs/usr/lib:/jffs/usr/local/lib

find / -name *uClibc*執行完會出現:
/jffs/opt/lib/ld-uClibc-0.9.28.so
/jffs/opt/lib/ld-uClibc.so.0
/jffs/opt/lib/libuClibc-0.9.28.so
/lib/ld-uClibc.so.0
/opt/lib/ld-uClibc-0.9.28.so
/opt/lib/ld-uClibc.so.0
/opt/lib/libuClibc-0.9.28.so

因為mount的關係,實際上應該只有
/jffs/opt/lib/ld-uClibc-0.9.28.so
/jffs/opt/lib/ld-uClibc.so.0
/jffs/opt/lib/libuClibc-0.9.28.so
/lib/ld-uClibc.so.0

這樣看來,因為我LD_LIBRARY_PATH設定的關係
程式執行時會先去search /lib/下面的uclibc,而在/jffs/opt/lib/新版的uclibc會再舊版的uclibc之後被search,所以程式會讀到舊版的uclibc???

我還是不懂,當我將自行編譯的sqlite3的sharead library放到/jffs/opt/lib裡面時,程式也應該會先去search /lib/下面的uclibc,也應該會發生同樣的錯誤,但卻沒發生!? Why?
:crybaby


最後修改: James (2008-10-23 17:03:06)


離線

 

#6 2008-10-23 22:46:31

hippo
天使
註冊日期: 2008-10-07
文章數: 1562
目前積分 :   20 

Re: 如何判斷平台支不支援Large file

我算是比較懶, 都是直接用套件. 除非有需要用到的軟體, 而ipkg沒有, 才會找souce編譯.blushing
以下是我的環境, 與您的有所不同.

# mount rootfs on / type rootfs (rw) /dev/root on / type squashfs (ro) none on /dev type devfs (rw) proc on /proc type proc (rw) ramfs on /tmp type ramfs (rw) /dev/mtdblock/4 on /jffs type jffs2 (rw) /dev/discs/disc0/part5 on /jffs type ext2 (rw) /dev/discs/disc1/part5 on /opt type ext3 (rw)


注意到沒有, type ext2, type ext3, 由這邊可看到您mount該分割區所指定的格式.

# find / -name *uClibc* /jffs/lib/ld-uClibc.so.0 /jffs/lib/ld-uClibc-0.9.27.so /jffs/lib/libuClibc-0.9.27.so /lib/ld-uClibc.so.0 /opt/lib/ld-uClibc-0.9.28.so /opt/lib/libuClibc-0.9.28.so /opt/lib/ld-uClibc.so.0 /opt/lib/libuClibc++.so /opt/lib/libuClibc++.so.0 /opt/lib/libuClibc++-0.2.3.so


我安裝其他的套件, 有用到uClibc++, 所以與您的環境不同. 不過單就ld-uClibc而言就有三種, 分別放在不同的路徑, 分屬DD-WRT, OpenWrt, Optware.
好玩的是, 您如果觀察ipkg.conf

# cat /etc/ipkg.conf src whiterussian http://downloads.openwrt.org/whiterussian/packages src non-free http://downloads.openwrt.org/whiterussian/packages/non-free src backports http://downloads.openwrt.org/backports/rc5 dest root /jffs dest mmc /mmc dest smbfs /tmp/smbshare dest ram /tmp # cat /opt/etc/ipkg.conf #Uncomment the following line for native packages feed (if any) #src/gz native http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/native/stable src/gz optware http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable dest /opt/ / #option verbose-wget


DD-WRT動不了, 因為是firmware. 能夠自行增添的套件, 只有OpenWrt, Optware. 而不同的套件所屬, 使用不同的uClibc. 換句話說, 若您使用OpenWrt的套件, 就得讓該套件用OpenWrt的library. 因為該套件當初編譯時, 就是使用該版本的uClibc. 使用錯誤版本, 當然產生問題.
當然, 您自行編譯, 使用的版本0.9.28, 將uClibc放到正確的位置, 這樣程式運作就沒太大問題. 這也是一種方法, 也是open/free source迷人之處.big_smile

"因為mount的關係,實際上應該只有..." 不是這樣, 如前所述, 在您的機器上運作共有三個發行商(這樣表示可能清楚些), 檢視ipkg.conf, /opt 是Optware專屬, 只不過借用/jffs的軀殼. 在使用Optware的時候, 要單獨看待, 不要與/jffs/opt搞混, 避免出錯.

在使用Optware時, $LD_LIBRARY_PATH已經不需要了.

如果您懂的我說的那些東西, 恭喜您突破第二層障礙. 加油.smile


離線

 

#7 2008-10-24 09:32:53

James
新生
註冊日期: 2008-10-17
文章數: 31
目前積分 :   

Re: 如何判斷平台支不支援Large file

在未執行「mount -o bind /jffs/opt /opt」之前
執行「mount」,我得到

/dev/root on / type squashfs (ro) none on /dev type devfs (rw) proc on /proc type proc (rw) ramfs on /tmp type ramfs (rw) /dev/mtdblock/4 on /jffs type jffs2 (rw)


發現得到的types是squashfs、、devfs、proc、ramfs、jffs2跟我的預期不一樣。
於是我執行「cat /etc/fstab」才得到系統檔案的格式:

/dev/root / ext2 defaults 1 1


從這個網頁  Large File Support in Linux 查到的資料

  ext2 :Full support for LFS

ext2支援LFS,而如你之前說的「32, 64bit要看您執行哪種模式的操作系統來決定是否支援大檔案」,不曉得「如果得知何種模式的操作系統」呢?

關於掛載的部份mount -o bind /jffs/opt /opt,可能我的觀念有點問題wacko 我將了解的說出來:
1. 提供/opt一個足夠大且可寫的區域,來安裝DD-WRT的optwares
2. 假設安裝DD-WRT的uclibc-opt_0.9.28-13_mipsel.ipk,它會被安裝在/opt的目錄中
3. 執行 find / -name *uClibc*,因為mount的關係,/jffs/opt/lib/ld-uClibc-0.9.28.so、/jffs/opt/lib/ld-uClibc.so.0、/jffs/opt/lib/libuClibc-0.9.28.so 指的就是 /opt/lib/ld-uClibc-0.9.28.so、/opt/lib/ld-uClibc.so.0、/opt/lib/libuClibc-0.9.28.so。
4. /lib/ld-uClibc.so.0是dd-wrt本身的,無法被變更。

從/etc/ipkg.conf,我大概可以知道,如果是安裝openwrt的optware,它會安裝到的位置可能有:

   dest root /jffs
   dest mmc /mmc
   dest smbfs /tmp/smbshare
   dest ram /tmp

從/opt/etc/ipkg.conf,大概可以知道,如果我安裝dd-wrt的optware,它會被安裝的位置:

   dest /opt/ /

我了解/opt跟/jffs是單獨看待,只是說在find的過程中,/opt/jffs/opt裡面的檔案其實是同一個。

回到問題本身,我所有安裝的packages皆是dd-wrt的,所以應該不會有版本錯誤的問題才是。
雖然得知檔案系統是ext2 32位元,它支援Large File,而安裝sqlite3的ipkg之後,執行時卻會發生can't resolve symbol 'fstat64'
代表安裝的uclibc本身就沒有提供Large File的支援,雖然系統是ext2。
這大概是我推測的狀況。

謝謝告訴我關於ipkg.conf的內容,獲益良多。YA


離線

 

#8 2008-10-24 11:15:04

James
新生
註冊日期: 2008-10-17
文章數: 31
目前積分 :   

Re: 如何判斷平台支不支援Large file

我有查到一份資料 http://trac.macvicar.net/sqlite3/browse … nt.h?rev=2

Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch on the compiler command line.  This is necessary if you are compiling on a recent machine (ex: RedHat 7.2) but you want your code to work on an older machine (ex: RedHat 6.0).  If you compile on RedHat 7.2 without this option, LFS is enable.  But LFS does not exist in the kernel in RedHat 6.0, so the code won't work.

我利用

~ # cat /proc/version Linux version 2.4.34-pre2 (root@linux) (gcc version 3.4.6 (OpenWrt-2.0)) #170 Fr i Sep 15 20:10:21 CEST 2006


好像是查到Linux version 2.4.34-pre2,這根所謂的RedHat6.0或7.2應該不同!? (我不太了解,因為還是Linux新手)

而我的問題是,要如何知道Red Hat的版本呢?


離線

 

#9 2008-10-24 11:23:19

hippo
天使
註冊日期: 2008-10-07
文章數: 1562
目前積分 :   20 

Re: 如何判斷平台支不支援Large file

uname -a


離線

 

#10 2008-10-24 11:28:15

James
新生
註冊日期: 2008-10-17
文章數: 31
目前積分 :   

Re: 如何判斷平台支不支援Large file

Result:
   Linux DD-WRT 2.4.34-pre2 #170 Fri Sep 15 20:10:21 CEST 2006 mips unknown

Which version of RedHat ?wacko


離線

 

相關討論主題

主題 回覆 點閱 最後發表
1 11259 2013-05-24 07:21:37 作者 hippo
0 6170 2012-08-23 09:27:37 作者 hikaruu

友情連結

論壇頁尾

Powered by PunBB
© Copyright 2018 Rickard Andersson
RSS Feed