MozTW 討論區 https://forum.moztw.org/ |
|
Visual Studio 2005 編譯 - for Gecko 1.8 https://forum.moztw.org/viewtopic.php?f=18&t=16608 |
第 1 頁 (共 1 頁) |
發表人: | s793016 [ 2006-11-26, 09:33 ] |
文章主題 : | Visual Studio 2005 編譯 - for Gecko 1.8 |
大致寫一下,免得哪天電腦掛了找不到東西 (不過 moztw 最近也掛得很頻繁就是了 ... 囧rz)。 基本的安裝 vc、安裝 cygwin 我就不寫了。 如果您用 visual studio 2005 的目的是要編 pgo 最佳化,請仔細看完下面的東西。 修正 visual studio 2005 的 bug
在呼叫 vcvars32.bat 後,請手動加一行: set VCPROFILE_PATH=path optimize 參數中加入 /GL 指令 .mozconfig 中的 optimize 參數要加入 /GL。 使用 visual studio 2005 版的 moztools visual studio 2005 版的 moztools from mmoy 加入 mmoy manifest patch 在您下完 source code 後,請修改幾個檔:
不知為何那個目錄下的所有檔案,都不鳥 .mozconfig 中的 optimize 指定參數,所以只好手動加嘍。 開啟 mozilla\security\coreconf\win32.mk,在大約 115 行的位置會看到這個 代碼: else # !NS_USE_GCC ifdef BUILD_OPT OS_CFLAGS += -MD OPTIMIZER += -O DEFINES += -UDEBUG -U_DEBUG -DNDEBUG DLLFLAGS += -OUT:"$@" 手動把 .mozconfig 中 optimize 的參數加到「optimizer += -o」的後面吧,記得要存檔。 4/27 編輯:1.1.9 目錄名已經變成 coreconf,原先是 coreconfig。 統一 mozilla\security\nss\lib\freebl 內的最佳化參數 freebl 下的所有原始碼都會強制以 -Ox 編譯,這有時(?)會造成問題。 開啟 mozilla\security\nss\lib\freebl\Makefile,在大約 90 行的位置會看到這個: 代碼: else
MPI_SRCS += mpi_x86_asm.c DEFINES += -DMP_ASSEMBLY_MULTIPLY -DMP_ASSEMBLY_SQUARE DEFINES += -DMP_ASSEMBLY_DIV_2DX1D -DMP_USE_UINT_DIGIT -DMP_NO_MP_WORD ifdef BUILD_OPT OPTIMIZER += -Ox # maximum optimization for freebl endif endif endif 在 「Optimizer += -Ox」前面加「#」把它註解掉,記得要存檔。此項可改可不改,看個人。 取 log file,為 pgx 作準備 原先編譯的指令是: make -f client.mk ooxx 建議使用 pipe 的方式改成: make -f client.mk ooxx | tee logfilename 這樣的好處是,您可以在畫面上看到執行的過程,同時也會產生一個一模一樣的完整 logfile。 |
發表人: | s793016 [ 2006-11-26, 09:33 ] |
文章主題 : | |
作完上述的東西以後,就可以開始編了,等編完後開始針對 log 檔下手。 初步分析 log-file 取出 lib & link 指令 這是一步令人昏昏慾睡的步驟 ... 囧rz 先把 log-file 備份,然後用您最上手的文書程式開啟 log-file 檔,只留下這些東西:
到此請先另存備份。再開始下一階段。 整理出所有的 lib 命令,轉換成 dos 下的格式集中到一個批次檔內,並重新 lib 一次 pgo 版本需要用 -ltcg 來作 lib,但 .mozconfig 沒有方法可以把參數傳給 lib 指令,所以我們就把他抓出來,全部重新 lib 一次。 參照所有的 make[?]: Entering/Leaving directory 訊息,找出該行 lib 命令正確的目錄,然後把他轉成 cd directory,再在 lib 命令中插入「-ltcg」指令。如: 代碼: cd \mozilla\nsprpub\lib\ds lib -NOLOGO -ltcg -OUT:"plds4_s.lib" .\plarena.obj .\plhash.obj .\plvrsion.obj 至於之後的對應 nsinstall 命令,您可以把他改用 copy 來作。 整理出所有的 link 命令 & 會產出 exe 檔的 cl 命令,轉換成 dos 下的格式集中到一個批次檔內 pgo 版本需要用 -ltcg:pgi 來產生「調教版」,然後在調教完成後,再用 -ltcg:pgo 把調教的資料 link 回去產生最終版本,所以我們必需把他抓出來。 參照所有的 make[?]: Entering/Leaving directory 訊息,找出該行 link 命令正確的目錄,然後把他轉成 cd directory,再在 link 命令中插入「%ltcg%」指令。如: 代碼: cd \mozilla\security\nss\lib\fortcrypt link -nologo %ltcg% -DLL -SUBSYSTEM:WINDOWS -PDB:NONE -OUT:"\mozilla\nss\fort\stub.dll" -MAP \mozilla\nss\fort\maci.o 至於之後的對應 nsinstall 命令,您可以把他改用 copy 來作。 如果是 cl 命令,記得把 %ltcg% 加在 -link 指令的後面,如: 代碼: cd \mozilla\directory\c-sdk\config
cl now.obj -Fenow.exe -link %ltcg% 最後記得順便加上 mt 指令把產生的 manifest 檔埋進去,這邊的 %id%要注意,dll 檔用 2, exe 檔用 1。 引言回覆: mt -NOLOGO -MANIFEST \mozilla\nss\fort\stub.dll.manifest -OUTPUTRESOURCE:\mozilla\nss\fort\stub.dll;%id%
藍字部份現在已不建議這麼作了。因為不太能更換埋好的 manifest。 目前的建議作法是,參考此篇寫一個主程式用的 manifest 檔,再加上 msvcrt 用的 manifest 檔,然後只要把這兩個 manifest 與 3 個 msvcrt 的檔案跟主程式放在一起即可。 |
發表人: | s793016 [ 2006-11-26, 10:31 ] |
文章主題 : | |
重新以 -ltcg:pgi link 產生「調教用」版本 這步算是最花時間的。
好了之後,在 mozilla\dist\bin 會產生「調教版」。 「調教」您的 seamonkey/firefox 您可以把您自己在 program files 的 seamonkey/firefox 主目錄備份起來,然後用這個調教版直接蓋下去。 「調教版」因為需要設定環境變數,所以必需在 dos 下啟動。
在關閉「調教版」後,會產生一堆 pgc 檔在 vcprofile_path 目錄內。如果您沒設 vcprofile_path 則會產生在該「調教版」同一目錄內。 重新以 -ltcg:pgo link 產生「調教用」版本 這步花的時間比 -ltcg:pgi 少一半。
如果您 link pgo 過程中一直出現錯誤無法產生目的程式,您就必需改用 set ltcg=-ltcg:pgu 再去 link 一次。 至此產生的就是最終最佳化版 (pgo/pgu)。 在您丟出去前先測試一下,如果會「當掉」,代表您「調教版」看的網頁不夠多,再從「調教版」看更多的網頁,再重新 link pgo。 viewtopic.php?p=103323#103323 froce 寫: 重點不是編的時間...是調校的時間...Orz
編的時候人可以不在...調校時可不行... 其實可以不用像s793016老大寫的這麼麻煩... 編完第一次的"欠調校版"後...並且調校完成後... 砍掉dist資料夾裡所有的exe和dll... 再編第二次的"調校完成版"就行了... 當然正確的話還是s793016寫的正確... 不過在我自己測試下...其實出來效能沒有差很多... 當然...那個batch寫了可以用很久... 只要版號不是大改的話...或者是你.mozconfig沒有更動的話... 照理是可以都不用換的...所以痛苦一次其實也沒差... |
發表人: | s793016 [ 2006-11-26, 10:44 ] |
文章主題 : | |
我自己使用的設定檔 for 1.1.6 內含: relink116.bat - (4NT 版,用 cmd 會出錯) for Seamonkey 1.1.6 .mozconfig - 不用解釋了吧 moz.bat - 設定環境變數用 目前用的版本 本串謹供參考 |
發表人: | froce [ 2006-12-03, 21:07 ] |
文章主題 : | |
請問... "取 log file,為 pgx 作準備" 這步編出來的應該是"一般加入了cpu優化指令"...可以正常使用的firefox對不對?... 我目前用vc8編出來的...一執行就會出現"應用程式初始化錯誤"... 包括目前的trunk... 目前完全沒頭緒...Orz 編譯環境的設置我是照這篇來設置... 請問有沒有特別要注意的地方呢?... |
發表人: | s793016 [ 2006-12-03, 22:34 ] |
文章主題 : | |
froce 寫: 請問...
"取 log file,為 pgx 作準備" 這步編出來的應該是"一般加入了cpu優化指令"...可以正常使用的firefox對不對?... 我目前用vc8編出來的...一執行就會出現"應用程式初始化錯誤"... 包括目前的trunk... 目前完全沒頭緒...Orz 編譯環境的設置我是照這篇來設置... 請問有沒有特別要注意的地方呢?... 記得您之前遇到的 xpidl crash 嗎?這個是一樣的問題。 firefox.exe.manifest 雖然會自動產生,但不會 copy 過去 dist\bin,要自己手動 copy。 不拷也可以,但要用 mt 把 manifest 埋進去執行檔。 |
發表人: | froce [ 2006-12-03, 23:16 ] |
文章主題 : | |
s793016 寫: froce 寫: 請問... "取 log file,為 pgx 作準備" 這步編出來的應該是"一般加入了cpu優化指令"...可以正常使用的firefox對不對?... 我目前用vc8編出來的...一執行就會出現"應用程式初始化錯誤"... 包括目前的trunk... 目前完全沒頭緒...Orz 編譯環境的設置我是照這篇來設置... 請問有沒有特別要注意的地方呢?... 記得您之前遇到的 xpidl crash 嗎?這個是一樣的問題。 firefox.exe.manifest 雖然會自動產生,但不會 copy 過去 dist\bin,要自己手動 copy。 不拷也可以,但要用 mt 把 manifest 埋進去執行檔。 也就是說...把您檔案裡的all.manifest改名firefox.exe.manifest... 然後就可以了?... 因為mt指令我實在不會用...Orz 您寫的bat我沒把握會用...(汗 |
發表人: | s793016 [ 2006-12-04, 22:13 ] |
文章主題 : | |
froce 寫: s793016 寫: 記得您之前遇到的 xpidl crash 嗎?這個是一樣的問題。 firefox.exe.manifest 雖然會自動產生,但不會 copy 過去 dist\bin,要自己手動 copy。 不拷也可以,但要用 mt 把 manifest 埋進去執行檔。 也就是說...把您檔案裡的all.manifest改名firefox.exe.manifest... 然後就可以了?... 基本上可以算對吧 ... 不過正解是要在 obj 目錄 (如果您沒設 obj,那要在 mozilla source 全目錄) 中搜尋 firefox.exe.manifest,再自己 copy 過去。 froce 寫: 因為mt指令我實在不會用...Orz 不會用那就 copy *.manifest 吧,只是多很多小檔案不好看而已 ... 囧
不然也可以試試手動 patch:把 Un-bitrotted embed manifest files with check for mt.exe - patch#1 ~ 4 自己手動改進去 ... 如果您 visual studio 2005 已經裝了 sp1 beta 的話,記得 manifest 中的版號要改成跟 vc redist 中的一樣 (懶得改的話就直接用 all.manifest 上吧) ,不然即使您搭 msvcr80.dll 給人也會一樣不能動的,就像我上面遇到的情形一樣 ... 囧 其實 firefox 因為 static link 的關係,真正 log 檔抓出來 link 指令應該所剩無幾,不像 seamonkey 的 ... 1xxk 啊 ... 囧rz 不過也因為他是 static link 的,所以他在最終 link 要的 ram 就會很恐佈了 ... 我 link seamonkey 全部 dll ,吃的 ram 最多沒有超過 600m 的,虧我搞了 5G swap 在等他 ... 囧 不過 seamonkey 的 dll 是「獨立」的 dll,不像 firefox 是集合成一包,所以 firefox 最終 link 時要的 ram 超過 1G 其實是可以預期的 ... ^^; |
發表人: | s793016 [ 2007-02-02, 23:08 ] |
文章主題 : | |
環境更新到 Visual Studio 2005 SP1,編 seamonkey 1.1 版,遇到很奇怪的狀況,link 參數如果只用「-LTCG」,就可以成功的編出東西來,如果用「-LTCG:PGI」,則很多代碼都會出現下面錯誤,東西就編不出來。 代碼: xxx.obj : error LNK2001: unresolved external symbol ___PogoPushAllXmm@0
xxx.obj : error LNK2001: unresolved external symbol ___PogoPopAllXmm@0 xxx.dll : fatal error LNK1120: 2 unresolved externals |
發表人: | s793016 [ 2007-03-11, 09:43 ] |
文章主題 : | |
s793016 寫: 環境更新到 Visual Studio 2005 SP1,編 seamonkey 1.1 版,遇到很奇怪的狀況,link 參數如果只用「-LTCG」,就可以成功的編出東西來,如果用「-LTCG:PGI」,則很多代碼都會出現下面錯誤,東西就編不出來。
代碼: xxx.obj : error LNK2001: unresolved external symbol ___PogoPushAllXmm@0 xxx.obj : error LNK2001: unresolved external symbol ___PogoPopAllXmm@0 xxx.dll : fatal error LNK1120: 2 unresolved externals 我剛發現我現在的組態 1.0.6 都一樣會有這個問題,把 vs2005 整個移掉重裝一次看看有無改善 ... 囧 |
發表人: | s793016 [ 2007-03-20, 22:57 ] | ||
文章主題 : | |||
s793016 寫: s793016 寫: 環境更新到 Visual Studio 2005 SP1,編 seamonkey 1.1 版,遇到很奇怪的狀況,link 參數如果只用「-LTCG」,就可以成功的編出東西來,如果用「-LTCG:PGI」,則很多代碼都會出現下面錯誤,東西就編不出來。 代碼: xxx.obj : error LNK2001: unresolved external symbol ___PogoPushAllXmm@0 xxx.obj : error LNK2001: unresolved external symbol ___PogoPopAllXmm@0 xxx.dll : fatal error LNK1120: 2 unresolved externals 我剛發現我現在的組態 1.0.6 都一樣會有這個問題,把 vs2005 整個移掉重裝一次看看有無改善 ... 囧 重裝 VS2005 後已經解決了這個問題,不過出現了一個更奇怪的問題 ... 試過重裝 VS2005 或換編其他版的 Seamonkey 都一樣,該不會要我重灌 XP 吧 ... Orz 追加:我在 VMWare 下裝新的中文 XP 試編過,這個問題一樣存在,目前裝了一套英文 XP,還在試編中。
|
發表人: | s793016 [ 2007-09-24, 22:47 ] |
文章主題 : | |
前三篇的問題在我換了一顆 CPU 後已經排除,所以問題的原因應該就是:CPU 掛了 ... 囧。 |
發表人: | froce [ 2007-09-25, 21:22 ] |
文章主題 : | |
s793016 寫: 前三篇的問題在我換了一顆 CPU 後已經排除,所以問題的原因應該就是:CPU 掛了 ... 囧。
夠囧... 我才在想說我編那麼多次都沒發生這種事... 頂多BSOD而已...Orz |
第 1 頁 (共 1 頁) | 所有顯示的時間為 UTC + 8 小時 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |