標籤

4GL (1) 人才發展 (10) 人物 (3) 太陽能 (4) 心理 (3) 心靈 (10) 文學 (31) 生活常識 (14) 光學 (1) 名句 (10) 即時通訊軟體 (2) 奇狐 (2) 爬蟲 (1) 音樂 (2) 產業 (5) 郭語錄 (3) 無聊 (3) 統計 (4) 新聞 (1) 經濟學 (1) 經營管理 (42) 解析度 (1) 遊戲 (5) 電學 (1) 網管 (10) 廣告 (1) 數學 (1) 機率 (1) 雜趣 (1) 證券 (4) 證券期貨 (1) ABAP (15) AD (1) agentflow (4) AJAX (1) Android (1) AnyChart (1) Apache (14) BASIS (4) BDL (1) C# (1) Church (1) CIE (1) CO (38) Converter (1) cron (1) CSS (23) DMS (1) DVD (1) Eclipse (1) English (1) excel (5) Exchange (4) Failover (1) Fedora (1) FI (57) File Transfer (1) Firefox (3) FM (2) fourjs (1) Genero (1) gladiatus (1) google (1) Google Maps API (2) grep (1) Grub (1) HR (2) html (23) HTS (8) IE (1) IE 8 (1) IIS (1) IMAP (3) Internet Explorer (1) java (4) JavaScript (22) jQuery (6) JSON (1) K3b (1) ldd (1) LED (3) Linux (119) Linux Mint (4) Load Balance (1) Microsoft (2) MIS (2) MM (51) MSSQL (1) MySQL (27) Network (1) NFS (1) Office (1) OpenSSL (1) Oracle (127) Outlook (3) PDF (6) Perl (60) PHP (33) PL/SQL (1) PL/SQL Developer (1) PM (3) Postfix (2) postfwd (1) PostgreSQL (1) PP (50) python (5) QM (1) Red Hat (4) Reporting Service (28) ruby (11) SAP (234) scp (1) SD (16) sed (1) Selenium (3) Selenium-WebDriver (5) shell (5) SQL (4) SQL server (8) sqlplus (1) SQuirreL SQL Client (1) SSH (3) SWOT (3) Symantec (2) T-SQL (7) Tera Term (2) tip (1) tiptop (24) Tomcat (6) Trouble Shooting (1) Tuning (5) Ubuntu (37) ufw (1) utf-8 (1) VIM (11) Virtual Machine (2) VirtualBox (1) vnc (3) Web Service (2) wget (1) Windows (19) Windows (1) WM (6) Xvfb (2) youtube (1) yum (2)

2014年2月21日 星期五

ld, ld.so 和 ldconfig 的行為


http://fcamel-life.blogspot.tw/2012/01/ld-ldso-ldconfig.html

ld, ld.so 和 ldconfig 的行為

TLPI ch41 相當值得一看, 從開發者使用 library 的角度說明 library 的生成、靜態連結、動態連結 (載入) 的行為, 內容不多不少, 正好就是我想知道的, 省了看 linker、loader 的時間。

shared library 的名詞介紹

  • soname: 記錄在 shared library header 裡的名稱, 格式為 libX.so.MAJOR。要有同名檔案, 供之後程式載入 shared library 時使用
  • real name: shared library 的檔名, 格式為 libX.so.MAJOR.MINOR.NUMBER
  • linker name: 對 library X 來說, 就是 libX.so, 一般會是 symbolic link 指向最新的 major shared library
以 libjpeg 為例, 對應如下:
libjpeg.so -> libjpeg.so.62.0.0     # linker name
libjpeg.so.62 -> libjpeg.so.62.0.0  # soname
libjpeg.so.62.0.0                   # real name
這是我在 Ubuntu 裝好 package 後的樣子, 照理說 libjpeg.so 指向 libjpeg.so.62 應該會更彈性。
讀出 soname:
$ readelf -d libjpeg.so | grep SONAME
 0x000000000000000e (SONAME)             Library soname: [libjpeg.so.62]

static 和 dynamic linker

  • ld (ld.bfd) 是 static linker。Google 開發的 gold 是取代 ld.bfs 的 static linker。用 gcc 連結 shared library 或 executable 時就是呼叫 ld, 並將需要的參數傳給它。不論連結的是 static library 或 shared library, 都是 static linking。
  • ld 在連結 shared library 或 executable 時, 會將需要的 shared library 的 soname 寫入結果檔裡。注意, 只有 soname 而已, 沒有完整路徑。
  • ld-VERSION.so 是 dynamic (runtime) linker, 執行程式時, 由 runtime linker 載入 executable 開始。若 OS 用的 glibc 版本為 2.13, 就叫 ld-2.13.so。用 ldd 看所有執行檔, 都會找到它 (某個 symbolic link 連到 ld-2.13.so)。
以連結 libm.so 為例, 執行 gcc -lm prog.c -o prog 中間的部份行為如下:
  1. gcc 透過 -lm 的指示告知 ld 要連結 libm.so
  2. ld 會找到某處的 libm.so 指向 /lib/x86_64-linux-gnu/libm.so.6, 確認要用到的 symbol 都有, 沒有 link error
  3. ld 從 libm.so.6 的 header 讀出 soname "libm.so.6", 寫入 "libm.so.6" 到 prog 的 header。
執行 prog 時, ld-2.13.so 會從 prog 讀出 "libm.so.6", 再到預設的路徑上找檔名 "libm.so.6"。注意, static linking 時需要 libm.so, 但之後執行 prog 時用不到它, 因為記錄的 soname 為 "libm.so.6"。
關於 static linking 找檔名的順序, 可用 strace 觀察:
$ strace -e open,execve -f -o gcc.trace gcc -lm prog.c -o prog
在 gcc.trace 裡可看出一二。
ps.
  • 使用 execve 的目的是知道 child process 是那一個程式, 目標是看 ld 開敋的檔案
  • 可由 man 2 exec<TAB> 得知 system call 使用的 exec 函式為 execve。

ldconfig

執行 ldconfig 後, 它做的事如下:
  1. 讀出 /lib, /usr/lib, /etc/ld.so.conf 內的路徑之下的 shared library (ldconfig 會略過 symbolic link), 將結果寫入 /etc/ld.so.cache。之後 ld-2.13.so 會用 ld.so.cache 的記錄來找 shared library。
  2. ldconfig 會自動產生 symbolic link "libX.so.MAJOR" 指向最新版本的 shared library。例如 /lib/libfoo.so.2.0.1 的 soname 是 libbar.so.2, 執行 ldconfig 後, 它會產生 /lib/libbar.so.2 指向 /lib/libfoo.so.2.0.1。
之前困擾我許久的事就是第二步, 而 man ldconfig 裡沒提到這點。
結論是別隨便手動更新 soname 的檔案, 執行 ldconfig 後可能會出問題。裝套件後, 系統工具會自動跑 ldconfig 更新目錄, 可能會蓋掉自己手動更新的同檔名檔案。另外 ldconfig 沒有管 linker name, 若是自己編的 shared library, 要自己產生。

其它

若想連到舊的 major 版本 shared library, 得在 gcc 參數指定舊版檔名。還有可用 rpath 的參數寫入搜尋 shared library 的路徑到 shared library 或 executable 裡。關於這些細節, 還有 static linker 以及 dynamic linker 尋找 shared library 的完整順序, TLPI ch41 講得相當清楚。ch42 描述 dlopen, 之後再來翻翻。

ldconfig 是什麼?

http://www.gluck.tw/vic/vics-lab/ldconfig%E7%94%A8%E6%B3%95%E8%88%87%E8%AA%AA%E6%98%8E/

ldconfig用法與說明

執行環境Ubuntu 10.04.4 LTS 與kernel 2.6.32-320-generic
可由lsb_release -a 與 uname -r查看
ldconfig的用法很簡單,但重要的是libray & PATH的觀念

為什麼libaray需要管理?因為不論是軟體執行或Build 你的Source Code在這過程都有可能會需要連結到需要的函式庫

函式庫又分為動態連結Dynamic Linker和靜態連結Static Linker

在Linux 中動態與靜態的副檔名與差別簡述

(如果有興趣找任何的程式語言書籍應該都會介紹到compile過程與libary & header file吧)

——————————————————————————————————————–

動態連結檔會以*.so 或者 *.so.* 來表示 , compile出來的binary executable file較小 但執行速度較慢,因為他在執行時才會載入需要的函式庫

靜態連結為*.a,  compile出來的binary executable file較大 但執行速度較快,因為它需要的lib都包在自己身上拉

透過圖片解釋


PS 雖然英文有點破但應該可以了解我想表達甚麼吧

如果系統不知道你所安裝的套件、工具、或是Application Programming Interface的函式庫安裝位置當執行程式時就會產生錯誤因為找不到mach的lib

可以透過幾種方法和工具來告知Kernel,ldconfig就是其中之一

ldconfig會根據/etc/ld.so.conf內容去搜尋並將函式庫載入main memory提高執行速度

方法很簡單…要先知道你的函式庫安裝後的位置在哪

(可以透過pkg-config 得知,可以參考另一篇pkg-config說明與用法)

之後把lib路徑寫入/etc/ld.so.conf.d/XXX.conf檔案後執行ldconfig就完成了

以OpenCV為例,

sudo vi  /etc/ld.so.conf.d/opencv.conf
在檔案內寫入 /usr/local/lib 後存檔
sudo ldconfig

沒出現任何訊息是正常的,要更詳細了解ldconfig的用法man一下就好了


在當兵時時間較多就想說找本書看看充實一下自己,所以買了

鳥哥Linux私房菜基礎學習篇,當時對於linux是完全不了解

雖然書上寫得很詳細,但對於完全沒接觸過的東西要完全了解也實在有點困難@@

在Porting過程要懂得東西還真不少,Library函式庫的管理就是其中一大重點阿

回來看看鳥哥的書就了解原來是這樣有點被點醒的感覺

感謝鳥哥對於想進入Linux的人提供一個很好的入口


參考資料;

鳥哥Linux私房菜基礎學習篇

Refhat + perl DBD:Oracle error Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' ...

錯誤信息
install_driver(Oracle) failed: Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.11.1: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200

解決方式:


1. sudo vim /etc/ld.so.conf.d/oracle.conf
2. insert $ORACLE_HOME/lib 在oracle.conf ($ORACLE_HOME要實體路徑)
3. sudo ldconfig

2014年2月17日 星期一

T-SQL 民國日期欄位(varchar) 轉 西元日期

b.edit_date格式為yy/mm/dd (民國)

convert(varchar,convert(int,substring(b.edit_date,1,charindex('/',b.edit_date)-1))+1911)+
'/'+
substring(b.edit_date,charindex('/',b.edit_date)+1,datalength(b.edit_date))

2014年2月13日 星期四

在SAP DMS放入attachment


1. Define document type file size per file (否則filesize太小CV01N無法上傳)
T-Code : DC10
Path : IMG->Cross-Application Components->Document Management->Control Data->Define Document Types


雙擊進入


2. Define DEFAULT Data Carrier Type (CV01N無法上傳,會有錯誤訊息)
T-Code : DC20




3.上傳檔案
T-Code : CV01N


4. 在BOM裡面,attachment能夠放在三個地方:
     a. BOM header 的document assignment (tab)
     b. BOM item 的document assignment (tab)
     c. 直接為 BOM item 的component