參加了由 語言共事 Batonic Projects 於 了了空間 liáu liáu Art Space 所辦的第三屆《意象萎縮》「獨立出版聯合展覽」,以為只能報名一項作品,因此推出了印了500本還有一堆庫存的"夢裡相見"做展覽,現場還有超過40位國內外創作者的作品,名單相當豪華,人在南部有事無法北上的我捶心肝推薦!!
另在3/24(六)、3/25(日)會有"促進貨品銷路"的活動,意思是可以面對面跟創作者買到作品,而我的少量作品會委託好友 嚷嚷 賴舒勤在3/25(日)販售喔!!!
-《意象萎縮》獨立出版聯合展覽-
日期丨2018/3/17(六)-3/25(日)
時間丨15:00-20:30
地點丨了了空間 1F
- 促進貨品銷路 -
日期丨2018/3/24(六)-3/25(日)
時間丨15:00-20:30
地點丨了了空間 2F
第三屆《意象萎縮》「獨立出版聯合展覽」將在3\\17(六)~3\\25(日),每天下午三時至晚間八時半於 了了空間 liáu liáu Art Space 一樓舉行。此次聯展特別邀請本地與海外,超過40個印刷品相關出版者共同參與。
The 3rd Edition of Spectacular Atrophy features an Independent Publishing Exhibition with printed matter projects by over 40 artists and DIY publishers from Taipei, Taichung, Naha, Tokyo, Tainan, Hong Kong, Auckland, Beijing, and Athens.
第三回《意象萎縮》「独立系出版展覧会」—— 今回は海外からも40あまりのzineを取り寄せている。日時:3\\17(土)~3\\25(日)午後 15時~夜20時半
Newester \ #Zineforest (薄簿仔 A Thin Booklet) \ 然仙 Bryan & 國強 Ralph \ #三生 #SANSEI \ Ë The Author(小一) \ 盧悅 LU Yueh \ Pam Pam LIU \ Mariana Bisti \ Hole in the Wall Collective \ 荒謬 RidiCulous \ 破土 New Bloom \ 劉思妤 LIU Szuyu \ #毒草 Toxic Weeds \ #否国民 Hikokumin \ 鍾弦 ZHONG Xian \ 朱詠安 Amos CHU \ 散落 Les Morceaux \ 賴舒勤 LAI Shu Qin (嚷嚷) \ 郭以寬 KUO I-Kuan (解結好生) \ Dr. Riles Jay Bilgo \ 白木耳 White Fungus \ 石田祐規 Yuki Ishida \ 夢境放送 KUO Ting Yu \ 邱元男 CHIU Yuan Nan \ 何宇倫 Alan Ho Yu Lun \ 楊雨樵 Somanana RAIN \ TheVolcano 火山販賣舖 \ 黃煌智 (Von Vonchi) & 楊蕓瑄 Yunxuan Yang \ Solomon Mortimer & Zahra Killeen-Chance \ 陳家頡 CHEN Chia Chieh (Angus柒Photography) \ 手塚太加丸 Takamaru Tetsuka \ 森ジャム映画館 Morijam Theater \ 岡田真太郎 Shintaro Okada & 齋藤恵汰 Keita Saito & 川口正貴 Masaki KAWAGUCHI \ 宇宙通訊 Space Communications \ #ITWST (I Think We're Still Thinking) \ 鑽石水溝蓋 Diamond Drain Cover編輯部 \ 過去 x 未來 多提無用 No Future x No Past \ 臥龍二九。 磚刊團隊 Brick Publishing Group \ 気流舎 Quiriusha & #ハーポプロダクション Harpo Productions \ 不然你來當小寶 nobody can become Siao Bow \ 年刊ナハウス製作委員会 Nahause Yearbook Partnership
https://batonic.neocities.org/yxws3.html
同時也有1部Youtube影片,追蹤數超過1,240的網紅JohnFungMagic,也在其Youtube影片中提到,謝謝 INDEPENDENT WATCH 這只新款手錶! 變魔術前魔術師通常都有句口頭禪「Watch ? 」提醒觀眾要留心觀看!今次 Watch 有雙重意思, 大家細心留意我如何把這只 @independent watch ⌚️ 話變就變! ? Watch how these audience ...
「independent of x意思」的推薦目錄:
- 關於independent of x意思 在 不然你來當小寶 Facebook 的最讚貼文
- 關於independent of x意思 在 Kai Chi Leung 梁啟智 Facebook 的精選貼文
- 關於independent of x意思 在 JohnFungMagic Youtube 的最讚貼文
- 關於independent of x意思 在 [問題] 關於Position Independent Code 的概念 - 批踢踢實業坊 的評價
- 關於independent of x意思 在 Binomial Theorem Find Term independent of variable x 的評價
- 關於independent of x意思 在 Stochastic Processes Week 2 Poisson Processes - 棒棒生 的評價
- 關於independent of x意思 在 海防道- 【Herschel x Independent】 滑板聯名系列錢包 ... 的評價
- 關於independent of x意思 在 independent意思的評價費用和推薦,EDU.TW、YOUTUBE ... 的評價
independent of x意思 在 Kai Chi Leung 梁啟智 Facebook 的精選貼文
之前有關日本輻射的討論,引來了這個回應。雖然我仍然不認為去日本短期旅遊有普遍性的危險,但我其實十分支持這文章的其中一個重點:數據不是一切。順道謝謝在原貼留言的各路英雄。
【去唔去日本事小,誤解了輻射問題幫左政府就無謂啦】
——與梁啟智〈香港輻射高過東京〉一文商榷
文︰Tam Daniel
1. 梁啟智兄一文,網上傳播甚廣;或者大家壓力太大,需要更多理由到日本外遊。以下談不上是正式回覆。正式或嚴格的回覆可能要兩三年或更久才有可能寫起(等如永遠不會寫)。現下寫已頗遲,也勉力一試。因為即使我對梁兄的結論沒有太大反對,梁文過程中動用的假設,也是令人太不安。
如果你願意看這篇三不像,懇請讀完全文。
2. 梁啟智兄的觀點,若要簡化,就是說︰「大家看完數據後可以放心去日本旅遊!」
在這個問題上,我們其實有很多選擇,包括︰
a. 好驚日本,好驚輻射,雖然唔多清楚日本有幾多輻射,所以打死唔去(梁文要攻擊的對象)
b. 日本除福島外其實冇咩輻射,可以照去(梁文觀點)
c. 日本的輻射危機仲係好複雜,不過是否外遊,就可以自己因應個別處境衡量。
c就是本人嘗試闡釋的立場。
3. 梁啟智兄的文章拿官方的背景輻射(或譯「本底輻射」)來與香港比較,然後得出很安全的結論云云,其實意義不大。
「背景輻射」,按照國際原子能機構2007年《Safety Glossary》的定義,也不過是non-specified 的輻射而已。輻射固然乃是大自然中大量存在的自然能量,但人工輻射,同時亦計算在「背景輻射」之內。而人工輻射,其實包括︰
.五六十年代多國數百次核試的輻射落塵
.全球四百多座核電廠,在日常排放的輻射
.數量相信逾萬的各種核設施,例如核燃料加工廠,核武零件廠,核子軍艦,大學研究所內的prototype reactor,完全機密的軍事機地的核武開發,已關閉但未完成廢爐的老舊核電廠,低中階核廢料放置場,凡此種種,在日常排放的輻射
.數百個鈾鑛因開發而排放的輻射,遍布中亞、非洲、加拿大、澳洲等地。例如,澳洲的尾鑛污染問題,也是惡名昭著啦。
.多次知名及不知名、嚴重或宣稱不嚴重的核災與核事故,所大量持續排放的輻射。
.戰爭中採用化學武器,所留下的輻射
有趣的是︰無論哪一個官方機構,它都會強調人工輻射的比例極低。例如,世界核能協會(World Nuclear Association)提及的上述各種來自核工業的輻射,只佔背景輻射少於0.1%。
你信唔信呢?
我信的,我信佢的分類有問題,例如像「食物」「泥土」「核工業」,是三類輻射,但食物和泥土裡,幾乎必然有來自核工業的輻射,即統計假設上已混雜了結論。我也信,這種全球測量總計中必然有形式上的限制(例如地點)。何況,這種composition 的內在對比效果(相對性),有相當程度上是無意義的——宇宙射線的輻射再多,也不會令核工業輻射的威脅減少。
所以,我們要在在明白及提防的是︰「背景輻射」本身這種概念,其訂立與推銷都是帶著強烈的、愚民的政治企圖。
各國擁核政府就是希望大家覺得,哦,「背景輻射」是「大自然」的東西,本身都好高啦,核災與核工業沒有帶來好多額外的輻射啫。
亦因此,「背景輻射無害」的感覺是要警惕的。無論背景輻射混和了多少人工輻射,它依然有其健康風險。可參看俄羅斯科學院雅布各夫博士2013年的〈A Review and Critical Analysis of the “Effective Dose of Radiation” Concept〉。不少背景輻射很高的地方,其住民都有更高風險,出現癌症、淋巴染色體不正常、唐氏綜合症等疾病。
4. 輻射監測無論是否有作弊,它也有很大限制,它能反映的信息其實不多。特別是官方的輻射監測信息。
每個地點的輻射,與其環境因素有極大關係,包括風向、風速、濕度、降雨等等。按上述提到雅各布夫文章引述,切爾諾貝爾研究顯示,污染地區的電離輻射水平,一年之間可以改變一萬次。
同時,亦因此,輻射在短至數十米的距離內,已會有相當大的差異。VICE拍攝的紀錄片《來自福島的最新報告——與核共舞》中間有過這麼一節︰在福島一所學校裡,官方的輻射監測儀器的讀數為每小時0.164微希,走出幾十米,讀數便變成每小時3.5微希,足足是官方讀數的20倍。
這種巧妙的「作弊」操作,顯然是因為日本政府曾刻意在每個官方輻射監測據點認真除污之故。香港天文台理應沒有作弊動機。不過,這已經反映,輻射監測在技術上之複雜性及限制。
輻射監測,作為長時期的定點監測,它的主要意義只是一種區域性指數(包括自然與人工),聊勝於無,同時,透過監測碘131,理論上可以檢視附近有否核事故導致的大量輻射排放。
事實上,正如天文台明確表示,這種「輻射監測」只包括伽瑪射線(gamma rays)監測,即,數百種放射核種之中,貝他射線(beta rays)及阿爾發粒子(alpha particles)的監測,技術上便無法或不易做到。就像「輻射地圖」往往只標示銫137水平一樣,測量本身就是有強烈的限制。即監測指數,可能在某種情景下,遠遠不能反映風險。
5. 那麼香港有沒有貝他射線或阿爾發粒子呢?按照天文台出版的《香港環境輻射監測摘要2013》表示,雖然在東平洲自動伽馬譜法系統錄得的數據中,2013年「全年並沒有探測到人工放射性核素」,然而,在其他地方,一樣發現銫137、鍶90、鈈239等等放射核種。
它如是說︰
「二零一三年在部份土壤及沉澱物樣本中發現微量的人工伽馬放射性核素銫137,活度均在BRMP(Background Radiation Monitoring Programme )範圍之內。」
「二零一三年在部份大氣、水及食物樣本中發現微量的氚,活度均在本底輻射範圍之內。」
「二零一三年在部份大氣、食物及土壤樣本中發現微量的鍶-90,活度均在本底輻射範圍之內。」
「二零一三年在部份海藻、潮間帶土及海床沉澱物樣本中發現微量的鈈-239,活度均在BRMP範圍之內。」
天文台的解釋是︰這統統是數十年前的核試殘餘。氚的解釋還包括了「宇宙射線」。
這一方面可能是對的(部分輻射半衰期極長),另一方面也是錯的。因為政治上,誰都看得見,總之香港若有人工輻射,就必然與大亞灣核電廠無關,與嶺澳核電廠無關,與中國任何核設施無關,與福島核災無關——即使每年單單大亞灣核電廠已「合法」排放以 terabecquerel 計的氚進海洋(tera就是10的12次方),而且法定上限多年來一再提升,仲未計香港人不關心的4座嶺澳反應堆。
那麼,現在不妨再回帶看看梁啟智的三段論︰
.香港輻射高過東京?用背景輻射讀數衡量的話,對呀。
.背景輻射高小小,也沒有大問題?介乎對與錯之間,要視乎放射核種、曝照形式,和究竟有幾高。
.所以,東京不像傳聞那麼危險?介乎對與錯之間,要旁及其他因素(後文會嘗試整理一部分),但肯定不是「所以」。
而無論如何,我們在理解的過程中,要記得,「背景輻射」整個概念的操作,就是為了抵賴。核工業冇責任,一切是宇宙的錯,歷史的錯(太平洋核試)。
6. 至於對讀數的詮釋,梁啟智用了多個方法。姑妄逐一說明。
首先,他舉了吃香蕉做例子。香蕉的自然輻射,人體會嘗試平衡。而且,香蕉的輻射是鉀40,不同的放射核種的健康風險十分不同。美國有個科學新聞記者Maggie Koerth-Baker,幾年前寫了一篇〈香蕉具輻射—— 但這不是解釋輻射曝照的好方法〉(Bananas are radioactive—But they aren't a good way to explain radiation exposure),不算是好專業或好完整,但也值得一讀。
第二個例子,照X光。照一次肺的X光大約20微希——也順帶一提,原來直至上世紀中,歐美仍是很流行照X光,連買鞋子也會照,名叫fluoroscopes。後來被禁止了,因為發現了X光的輻射的危險性。發現當中危機的流行病學家Alice Stewart,正正是指出低劑量輻射的危險(下文會再簡述)。而除了X光外,我們還有別的醫學上的儀器,例如CT scan 的輻射是2至16毫希,即2000微希至16000微希,超出了所謂國際安全標準(每年1毫希)2至16倍。
梁啟智用日常生活來說明輻射「平易近人」,這樣的修辭手段固然危險。更危險的是︰他的寫法,其實正在假設輻射的劑量是可以輕易測度並量化的,而此量化為「milisievert」後的劑量與風險有清楚的正比關係。這個問題的複雜性,就不是我能夠提出嚴格異議了,因為在科學的學術領域上,這仍舊是一個爭辯中與探索中的問題(然而低劑量的風險,卻幾近是所有獨立科學家的共識)。
7. 最後一個梁啟智用來說明輻射劑量的例子,是十分離譜的。他說︰「美國政府對核作業者的規定,是每年不多於50,000微希伏特。」
這是甚麼呢?這是一個剝削工人健康的規定,縱容核工業的存在。立場擁核的國際放射防護委員會(ICRP)的規定是——公眾的輻射劑量標準為每年1毫希,超出此一水平便會有健康風險。這種所謂安全標準其實是假設輻射有其「安全閥值」(threshold),在過去二三十年已面臨巨大挑戰。
更何況,梁啟智這裡引述的美國核工業人員標準︰50,000微希,即是50毫希,即是超標50倍。
即,為了大家可以有核電用,有核武可以發動戰爭或外交施壓,美國政府就設計了這類規定。核電工人就是超人,可以承受比正常人多50倍輻射。這就是所謂「職業健康」的神奇概念。
當然也不止美國,ICRP也是這樣,只是沒有美國離譜。ICRP的規定是︰核工業人員每年的輻射劑量標準是20毫希。你只要是小超人,你便可以做核工人。
一言蔽之,這種標準在科學上是毫無意義的。這種標準只是為了得出「核工人工作時輻射劑量沒有超標」的結論,以便核企業能拒絕所有索償。
美國核能協會(ANS)的福島核災報告便提到,日本還有「緊急輻射劑量上限(emergency dose limit)」這回事︰
「日本核工人的標準劑量上限是每年50毫希,及5年內不可超過100毫希。福島核災前,緊急劑量上限是每年100毫希,但意外發生後,這個上限提升至每年250毫希,以便工人能回應這次嚴重的意外。」
又述及︰
被曝照至最高劑量的其中一個工人紀錄,為670毫希(即公眾 670年 輻射劑量的安全標準),另外6個工人超過了緊急劑量上限(250毫希),408個工人也超過了每年 50毫希 的上限。
這是官方紀錄,你信唔信只有四百幾名工人超標?單是核災頭半年,便有18,000名工人參與救災了。(切爾諾貝爾核災有60萬名工人參與救災。)何況,唔超標的咪做半年,超標咪做兩個月囉,大超標咪做三日囉。總之,用到你盡,而事實上,所謂「多勞多得」,工人也很可能不甘心做三日咁短,唔超標的工人,最終都會做到超標。這種健康的消秏,是百分百不 sustainable 的。這種職業健康的標準設定,是極端 unethical 的。
信唔信都不重要,梁啟智用這點來解讀輻射讀數,只想借用其「你睇下丫美國佬話50,000微希都唔死得人呀(日本咁小小駛乜驚)」的效果,而不明確說明這個例子的背景,就算不是誤導,也至少是嚴重的遺缺了。
8. 輻射沒有安全標準,低劑量也有健康風險。
第一,所謂「國際安全輻射劑量」,即現時所採用的「每年1毫希」,其整套流行病學上的風險計算,其資料分析是建基自廣島研究。廣島研究是美國對日本廣島及長崎倖存者的研究,政治企圖昭然若揭(一方面是核武實驗下集,另一方面就是要講到冇咩事,以便全球推銷「和平原子」)。對廣島研究的批判,平易近人的版本可參見Gayle Greene的《The Woman Who Knew Too Much: Alice Stewart and the Secrets of Radiation》第9章〈Taking on the International Nuclear Regulatory System〉,最主要的觀點是指出廣島研究其實是一個 survival of the fittest 的偏頗紀錄。(嚴格的版本可看MSK三人組寫的漢福核武廠工人健康研究,我舉手,未看過,所以建議大家看上述的平易近人版)。
第二,低劑量風險的研究,早就開始。由1978年Karl Morgan 的〈Cancer and low level ionizing radiation〉,到Gofman的《Radiation-Induced Cancer from Low-Dose Exposure: An Independent Analysis》,或Alice Stewart的漢福核武廠工人資料分析(1977及1993),他們均指出,輻射沒有安全劑量這回事,餘不一一。
9. 回到最中心的問題︰去日本外遊安全嗎?
沒有標準答案,但我們可以知道以下原則,和僅有的資料
.懷孕女士及小童,radiosensitivity明顯較高;理論上通常年紀越大,radiosensitivity 越低(但老人家又因為身體開始衰弱,免疫力下降,所以輻射傷害都未必不大)。
.除污未善的實際情況,一定比官方所說的嚴重。
.輻射污染的風險,不但包括「背景輻射」、空氣或泥土中的輻射,還包括食物。
.按台灣環境資訊中心報導(題為〈【追蹤福島核災】那須希望之砦——日本民間輻射檢測有Know-how〉),台灣民間團體日前赴日了解,其中,也拜訪栃木縣民間檢驗單位「那須希望之砦」。
.檢測數據相當不理想。報導指出︰8月來自福島縣金山町的四個樣本,全數驗出放射性銫,三個超標至1倍或2倍以上;4月栃木縣產20個樣本,過半驗出銫,六個超標1至4倍不等。以2015年度而言,菇類跟山菜類過半驗出銫,魚肉近半,果實類1-2成,米跟果實都在一成以下。此外,土壤類幾乎全部驗出銫,部份遠遠超出中央政府標準(每公斤8,000貝可)。
大家請去報導的網站,看看貼出來的劉黎兒拍下的照片,那是一份結果整理報表,右面統統是紅色(超標)。
.報導亦指出︰2016年9月,日本中央政府抽驗結果,超標率約0.01%。但這套結果,不包括鮟鱇、竹莢魚、海膽等水產物,而且官方只驗銫137,沒有驗鍶90(部分民間通路有加驗)。
.有大量輻射的污水排出太平洋的新聞,仍舊此起彼落。福島核電廠附近的地下水的輻射污染水平持續大幅上升。例如︰
2016.06.26 七百萬貝可beta核種污水洩漏
2016.03.23 二十億貝可銫污水洩漏
2015.12.15 二號反應堆地下水鍶水平上升十倍
2015.12.12 福島核電廠底層存留水銫水平較去年上升四千倍
2015.11.09 七十二億貝可beta核種污水洩漏
可參考︰http://fukushima-diary.com/fukus…/contaminated-water-crisis/
.福島兒童甲狀腺癌發病率比正常高50倍。有專家估計,白血病、乳癌及其他癌症個案會上升。東京醫師三田茂認為他所檢驗過的病人,血液變異的情況嚴峻,選擇離開東京,遷往關西。
.即使從來沒有核災意外的數十座歐洲核電廠,要安全廢爐,也動輒要數十年,開銷以十億美元起跳。切爾諾貝爾核災現場,用幾十萬人生命換來的原有石棺,經過這30年已屆限期及嚴重退化,新的 shelter 正剛剛開始動工。他們在買時間,宣稱新的 shelter 能買100年回來,完成廢爐工作。福島面對同樣難題,可能永遠也沒有廢爐的一天。事實上,不要說廢爐後的部件,根本沒有核廢棄置場可以處理,單單是除污後出現的大量放射性表土,現時也沒有處置方法,只是堆在福島。簡而言之,這很可能是解決不了,甚至極可能會惡化下去的問題。
.輻射是能量,是無法被「消滅」的,唯一「消滅」的方法,是等,等到放射核種再也沒有放射能,即理論上,是半衰期的10倍。銫137的半衰期為30年,即300年才完成衰變。切爾諾貝爾核災27年後,2013年的意大利果醬,仍被驗出銫137超標。2010年,俄羅斯Bryansk地區的樹林火警,導致輻射四散,莫斯科的銫137濃度上升24倍。這些樹林,當年就是正正被切爾諾貝爾核災污染。日本土地的除污會否比蘇聯徹底很多?難以推斷。
10. 本文不是賣弄道德高地,也不是推銷苦行僧式清教徒情緒,鼓吹空洞的忿世嫉俗。如果問我去唔去日本?咁梗係去啦,香港咁鬱悶。我已38歲,且不見得往後會有小朋友。有咩問題,最多係社會少了一粒寄生蟲,大家冇眼屎乾淨盲啦。
在福島的問題上,大家都支持日本朋友。但無論大家去唔去外遊,這種正面的支持,唯一合理的立場展現,仍然是堅決反對所謂「復興」論調,警惕一切指向「遺忘」的語言。這種語言只會 trivialize 受害者的痛苦,縱容日本政府拒絕承認責任,為日本重啟核電提供政治能量。如果日本政府說「強制撤離區」任何一處已除污妥當,已安全,福島人可以回去住喇,我們也不必「鄧佢地高興」,這裡的意思就是,冇咩政治壓力,國家不會繼續支援你喇,食自己啦。根本,一切大小問題,以核災的日程計,仍然是現在進行式。
我對梁啟智從來沒有甚麼偏見,但他作為一個開放、親民主、敏感於民情、表達能力優秀的學者,引用看似中立的數據,即便結論沒有偏幫政府的意識,其立論的過程,對「數據」的倚重態度,所透現的說服力與感染力,實在不問可知。
因此,上述爭論,我最想最想指出的粗淺結論是︰Alarmism 當然不理想,但「數據」本身,往往有極大限制。因為,數據必然有其建立的語境,而那個語境的信息內容,不一定會公開,更不一定會正確。我們越能夠輕易得到、流播甚廣的官方數據,它往往越大機會經過權力的細心挑選與嚴謹結構。而且幾乎必然會為政治服務,為權力服務。民間也會有它的數據,但往往難免是遺缺、非系統性、掛一漏萬的。
今天流行的「小小輻射唔駛驚」「核電廠也是減碳選項之一,唯一問題就是核災,香港不是地震帶,邊有咁橋,中六合彩咩」,其實就是歷史產物——先有廣島研究,再有1950年代世衛與國際原子能機構簽訂的協議,限定除非得到國際原子能機構同意,否則世衛不可出版任何關於輻射健康風險的研究。
如果認真呼吸,好好想像輻射的無色無味、難以監測,普通人的無助,歷史岔路的縱深,擁核與產核機構的橫向的寬闊,勾結的盤根錯節,部分學術界的 systemic corruption,未來的不可知——我們便明白,這種技術的多向度發展,其實遠遠超出我們能夠控制與理解的範圍。誰有資源做這樣的研究?或,輻射的影響與健康的correlation,真的可以研究嗎?
例如,掛在核電廠工人身上的任何警報,能夠測量到那名工人工作時 inhalation 中的輻射水平嗎?以萬計的外判底層工人,其健康情況,能夠做到長期 tracking 嗎?當發現身體有問題,才去搜證,會否太遲,到時還有沒有可能再「紀錄」身體承受過的輻射,劑量、時地人?而反核、討償、說明核工業與健康問題之絕對因果關係的論證責任,卻偏偏落在受害與沒有資源的民間一方。
我們既不用全盤採信 alarmism,也不用每事排斥官方數據與論述。然而,在軍事與國家的權力面前,我們的責任,是分析及還原官方謊言的脈絡,進而正視「陰謀論」的正義,看見它的理性與真誠。否則,若一時貪口爽,找個騎牆的臨時支點,成為了官方假設的幫兇,也是無謂了。
(ps 行文匆匆,如有錯漏,歡迎指正 :) )
那須希望之砦——日本民間輻射檢測有Know-how
http://e-info.org.tw/node/201461
VICE︰來自福島的最新報告——與核共舞
http://www.iqiyi.com/w_19rs1n7mdp.html
Alexei Yablokov: A Review and Critical Analysis of the “Effective Dose of Radiation” Concept
http://www.journalhealthpollution.org/…/10…/2156-9614-3.5.13
Rosalie Bertell: Limitations of the ICRP Recommendations for Worker and Public Protection from Ionizing Radiation
http://www.ccnr.org/radiation_standards.html
Bananas are radioactive—But they aren't a good way to explain radiation exposure
http://boingboing.net/2010/08/27/bananas-are-radioact.html
The Insane Cancer Machines That Used to Live in Shoe Stores Everywhere
http://gizmodo.com/the-insane-cancer-machines-that-used-to-…
《香港環境輻射監測摘要2013》
http://www.hko.gov.hk/publica/rm/rm034.pdf
Fukushima Daiichi: ANS Committee Report
http://fukushima.ans.org/report/health-physics
Fukushima Diary: Contaminated Water Crisis
http://fukushima-diary.com/fukus…/contaminated-water-crisis/
20160813 RSKラジオ 三田医院 三田茂院長
https://matome.naver.jp/…/2140370981635…/2147167581503793103
Decommissioning a Nuclear Plant Can Cost $1 Billion and Take Decades
http://www.reuters.com/article/idUS178883596820110613
〈切爾諾貝爾核災30.保護罩到期
需阻輻射外泄.新「石棺」進度落後〉
http://news.mingpao.com/…/art…/20160426/s00014/1461608438911
Critical Analysis of the UNSCEAR Report upon Fukushima
http://www.psr.org/asse…/pdfs/2014-unscear-full-critique.pdf
John Gofman: Radiation-Induced Cancer From Low-Dose Exposure
https://ratical.org/radiation/CNR/RIC/contents.html
independent of x意思 在 JohnFungMagic Youtube 的最讚貼文
謝謝 INDEPENDENT WATCH 這只新款手錶!
變魔術前魔術師通常都有句口頭禪「Watch ? 」提醒觀眾要留心觀看!今次 Watch 有雙重意思, 大家細心留意我如何把這只 @independent watch ⌚️ 話變就變! ?
Watch how these audience watch me do magic with this Independent Watch! ?⌚️
independent of x意思 在 Binomial Theorem Find Term independent of variable x 的推薦與評價
https://www.youtube.com/@MathematicsTutor Anil Kumar FREE Math Classes: https://www.globalmathinstitute.com/class-enrollment/ NEXT: ... ... <看更多>
independent of x意思 在 Stochastic Processes Week 2 Poisson Processes - 棒棒生 的推薦與評價
L.H.S. 意思是, 到時間t 為止正好發生n 次事件的機率 R.H.S. 以下兩種都可以解釋: ... A random variable X possesses the memoryless property, iff ... <看更多>
independent of x意思 在 [問題] 關於Position Independent Code 的概念 - 批踢踢實業坊 的推薦與評價
遇到的問題: (題意請描述清楚)
本人最近在閱讀某本書,看到動態連結這邊看了老半天,查了一堆資料
卻還是沒辦法完全參透他的意思
在介紹動態連結的時候
他一開始提出的方案為 load time relocation,也就是把重定推遲到載入時才執行
後來書上說
這樣會讓多個行程無法共用該 DSO,沒有達到節省記憶體空間的好處
因此後來出現了 PIC 的概念
這樣可以讓 .text 載入的時候不用重定,而 .data 又可以在不同行程有副本
這幾句話我看了老半天看不懂
1. 為什麼 load time relocation 會造成 DSO 無法被共用?
2. .data 裡面的 GOT,書上說在載入的時候 ld.so 會更新裡面欄位的值,
這跟多行程能否共用該 DSO,在不同行程有副本又有什麼關係?
短短幾頁就讓我無法頓悟,希望對這方面有心得的前輩可以多多幫忙一下
謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.250.174.228
> -------------------------------------------------------------------------- <
作者: littleshan (我要加入劍道社!) 看板: C_and_CPP
標題: Re: [問題] 關於 Position Independent Code 的概念
時間: Sun Oct 10 17:18:19 2010
※ 引述《nowar100 (拋磚引玉)》之銘言:
: 遇到的問題: (題意請描述清楚)
: 本人最近在閱讀某本書,看到動態連結這邊看了老半天,查了一堆資料
: 卻還是沒辦法完全參透他的意思
先猜那本書就是「程式設計師的自我修養」XD
: 在介紹動態連結的時候
: 他一開始提出的方案為 load time relocation,也就是把重定推遲到載入時才執行
: 後來書上說
: 這樣會讓多個行程無法共用該 DSO,沒有達到節省記憶體空間的好處
: 因此後來出現了 PIC 的概念
: 這樣可以讓 .text 載入的時候不用重定,而 .data 又可以在不同行程有副本
: 這幾句話我看了老半天看不懂
: 1. 為什麼 load time relocation 會造成 DSO 無法被共用?
假設有一段 code 是這樣:
int x; // global variable
void inc()
{
++x;
}
compile 的時候,因為 x 的位址無法確定
所以 inc 的指令會像這樣
.code
inc:
mov XXXX, %eax
inc %eax
mov %eax, XXXX
其中 XXXX 代表變數 x 的位址,這個位址要交給 linker 決定後再填入
假設有兩支程式 A 和 B 都會用到 inc()
那麼在執行 A 的時候
ld.so 會進行一次 relocation
並且把 XXXX 代換成 x 真正在記憶體中的位址
所以 inc 這段函式載入到記憶體後可能長這樣:
.code
inc:
mov 0x0004, %eax (這邊的意思是把 0x0004 這個位址的內容放進 %eax)
inc %eax (很久沒寫組語了,語法小錯誤請多見諒)
mov %eax, 0x0004
OK,現在 A 還沒跑玩,使用者又執行了 B 程式
ld.so 又進行第二次 relocation
不幸的是 B 這支程式包含了許多其它模組,因此 ld.so 把 x 分配到 0x2000 這個位址
這麼一來 inc() 會變這樣:
.code
inc:
mov 0x2000, %eax
inc %eax
mov %eax, 0x2000
也就是說,如果不使用 Position independent code
那麼 inc 這個函式編譯出來的碼
與不同的程式連結時,其指令的內容也會跟著不同
這麼一來 inc 這個函式勢必在記憶體中要有兩份副本
一份是給 A 用的 (x位址為 0x0004的版本)
另一份是給 B 用的 (x位址為 0x2000的版本)
: 2. .data 裡面的 GOT,書上說在載入的時候 ld.so 會更新裡面欄位的值,
: 這跟多行程能否共用該 DSO,在不同行程有副本又有什麼關係?
GOT 的目的是為了讓這個 DSO 可以存取另一個 DSO 中的 data
考慮一下上面的例子
如果 x 是定義於另一個 DSO 中的資料
同時我們又希望「存取 x 的指令本身是 position independent」
那方法就是繞一圈:先取得 GOT 的位址 (GOT 對於 DSO 來說算是定義於模組內的資料)
然後再從 GOT 的內容 (由ld.so填入) 去取得 x 的位址
: 短短幾頁就讓我無法頓悟,希望對這方面有心得的前輩可以多多幫忙一下
: 謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.80.53
> -------------------------------------------------------------------------- <
作者: purpose (purpose) 看板: C_and_CPP
標題: Re: [問題] 關於 Position Independent Code 的概念
時間: Sun Oct 10 17:43:52 2010
※ 引述《nowar100 (拋磚引玉)》之銘言:
: 遇到的問題: (題意請描述清楚)
: 本人最近在閱讀某本書,看到動態連結這邊看了老半天,查了一堆資料
程式設計師的自我修養?我買回來只有翻馬上想看的部份,查查資料
還沒看完,有機會可以在版上多討論討論。
: 卻還是沒辦法完全參透他的意思
: 在介紹動態連結的時候
: 他一開始提出的方案為 load time relocation,也就是把重定推遲到載入時才執行
先提一下,Windows 的 .exe (執行檔,即PE格式)、.dll (動態函式庫),
就是用「load time relocation」這個方法,
所以拿來跟 Linux 的 ELF (執行檔)、SO (動態函式庫) 對比很適合。
: 後來書上說
: 這樣會讓多個行程無法共用該 DSO,沒有達到節省記憶體空間的好處
: 因此後來出現了 PIC 的概念
: 這樣可以讓 .text 載入的時候不用重定,而 .data 又可以在不同行程有副本
: 這幾句話我看了老半天看不懂
: 1. 為什麼 load time relocation 會造成 DSO 無法被共用?
Windows 的 PE 格式,可以說有四大表格,即資源、匯入、匯出、重定位。
如果某執行檔呼叫了一個 MessageBox() 函數,可以推得就會有一個
call MessageBox 指令。在產生執行檔時,因為 MessageBox 是位於 user32.dll 裡面,
所以 PE 會先用一個假位址替代。然後在匯入表裡面,去放置如何從 user32.dll 取得
MessageBox 位址的資訊。
當你點兩下這個 .exe 開始執行,此時 Windows 的 Loader 把他載入到記憶體裡面,
接著 OS 從此執行檔的匯入表得知有用到 user32.dll,於是就把 user32.dll 這個模組
載入此執行檔的 address space 裡。
假設 user32.dll 是被載入到 0x10203040 位址裡,則原執行檔的 .text 裡面所有
呼叫 call MessageBox 的地方,此時才被修改至真正的位址,也就是 load time
relocation。
那 Windows 的 dll 跟 Linux 的 dso (*.so) 相比,並不能達到所謂的「節省記憶體
空間的好處」,因為 Linux 有所謂的 PIC,而 Windows 沒有。
假設 user32.dll!MessageBox 這個函數,其實只是一個空殼,真正的程式碼放在
user32.dll!realBox 裡,則又需要有個 call realBox 指令。
對於 Linux 來說這個 realBox 符號,可以是使用相對位址的 JUMP,比如跳到上方
距離 1000 位元組處;
因此不管有幾個執行檔呼叫了 MessageBox 進而需要跳到 realBox 都不需要
更改 user32 動態函式庫的 .text ,那麼一個 user32.so 就可以給多個行程使用。
而 Windows 比較單純 (原始?),上面提到有個 PE 四大表,而 .dll 也是用 PE 格式,
故也有重定位表。
在 user32.dll!MessageBox 裡的那行 call realBox 打從一開始就是絕對位址,
也就是『與位址相關的程式碼』。
當 user32.dll 作為模組,被某個行程載入進去後,因為每個執行檔可能要載入的模組
數量不一定,順序也不一定,所以 user32.dll 可能在 1.exe 被載入到 0x10203040,
而在 2.exe 卻是被載入到 0x10607080。
因為這不同的載入位址,所以導致 user32.dll!realBox 最終的絕對位址是不同的。
在 user32.dll 的重定位表裡面,就會記錄說在它自己的那些機器碼裡 (.text),
其中第 n 行的 call realBox 需要重定位,且第 k 行也用到 call realBox 指令
也需要重定位。當某執行檔載入 user32.dll 模組時,系統就會先到 user32.dll 的
.text 裡的這些地方去修改位址。(原諒我表達能力不好)
亦即 user32.dll 的 .text 會在 1.exe 跟 2.exe 各自有個副本 → 內容不一樣的副本。
那其實 .exe 也有重定位表,但因為 .exe 在預設狀況下,似乎都是設計成載入到
0x00400000 位址。所以 VC 在編譯時,遇到 1.exe!FunctionDoSomething 就不需要在
重定位表裡,記錄哪幾行有用到 call FunctionDoSomething 的位址,需要被重定位。
他很直接寫 call 0x00405678 就好。此 .exe 被載入記憶體時,這行指令完全不需要
修改,直接就拿來用。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.134.197
修文,上述內容不變動,新增以下內容。
下面補充一下 PE 四大表裡的匯入表的前世今生,
主要提供大方向觀念用,細節請翻資料,並動手驗證我講的內容正確性。
首先我們寫了個程式碼 my.c,
將 my.c 編譯後,會產生 my.obj (目的檔;如果用 gcc 就是 my.o),
再將其連結後產生的執行檔就是 my.exe。
my.exe 是一個所謂『PE 格式』的執行檔,
更進一步說,目前 Windows 的 執行檔 (*.exe)、動態連結檔 (*.dll) 都是PE格式。
PE 格式內部可以分成好幾個區塊,其中比較重要的區塊有
.text
放置的是機器碼,比如
mov eax, 3
add eax, 4
call MessageBox
匯出表
如果你建置的 PE 中,有 __declspec(dllexport) void foo (void)
這種要匯出的函數時,就會有此表。
因此我們可以利用 Dependency Walker 查看此表,來得知這個 dll 有哪些匯出
函數。
不是 .dll 裡的所有函數都會匯出給人用,比如 RegisterServiceProcess()
這個函數 google 一下會發現很多人在用,但是你是找不到匯出資訊的。
只能用 LoadLibrary() 動態載入 kernel32.dll 後,再用 GetProcAddress
取得其函數位址。
資源表
重定位表
不重要。
匯入表
功能是幫 call MessageBox 這樣的指令,在載入到記憶體後,
能夠被轉換成正確的位址。
如果用一些偵錯軟體,比如 OllyDbg 開 my.exe 做偵錯,然後按 Alt+M 就可以看到
記憶體分配圖。可以看到 my.exe 裡的 .text、匯入表等資訊,被映射到記憶體位址
0x00400000之後。而且開始運行程式後,按個暫停,再次看記憶體分配圖 (memory map)
多數都會有載入 kernel32.dll,他一樣是 .text 被載入到記憶體裡。
簡單講 .exe 跟 .dll 都算是映像檔 (image),因為執行時關鍵部份都被映射到記憶體,
而目的檔 .obj 就不是映射檔。
回到 my.c,假定其原始碼為
int main() {
MessageBox(參數隨便);
functionForMy();
return 0;
}
int functionForMy(void) {
;
}
編譯器翻譯成機器碼時,會有
call MessageBox
call functionForMy
編譯器一開始就認定 my.exe 將會被載入到 0x0040000,所以 functionForMy 的記憶體
位址,現在可以直接給定,比如說是 call 0x00415678。
那編譯器找不到 MessageBox 的絕對位址,他要怎麼知道這不是你打錯字,而是真的有
這個函數,只不過是透過「隱式連結」。
所以通常需要一行 #pragma comment(lib, "user32.lib") 的指令,告知連結器說
有個匯入用程式庫,裡面還有記載額外的函數資訊。
透過這個檔案知道 MessageBox 確實是個「隱式連結」的函數,不必回報錯誤,讓你重
寫程式。那麼在產生 my.exe 的時候,編譯器就會知道要填寫一個匯入表,裡面用到
一個模組叫 user32.dll,而且是只有用到其中一個函數,叫 MessageBox,簡單記為
user32!MessageBox。
匯入表其實由很多資料結構組成,可以講說由四組陣列在記錄匯入資訊。
其中有一組陣列,裡面每個元素的資料型態叫做「IMAGE_THUNK_DATA」,
這個資料型態名稱你可以把他當放屁,真的!
只要記住每個元素大小是「四位元組」就好,
因為這「四位元組」是 union,在不同情況下有不同意義,扮演四種角色。
我們首先需要知道,實際上 my.exe 的 call MessageBox 指令其實在編譯成 .exe 後
就固定不會改變了,比如寫 call dword ptr[0x00479100],那 0x00479100 這個位址
是什麼?他就像函數指標一樣,會放置 MessageBox 最終的絕對位址。
執行 call MessageBox 就等於,到 0x00479100 取出四個位元組內容,將其當作位址去
call。
這裡講到的 0x00479100 其實就是「匯入表」那四組陣列剛剛我提到的那一組,
每個元素都是「四位元組」的陣列。這個陣列又叫做 IAT (Import Address Table)。
當 user32.dll 作為模組載入到 my.exe 時,Windows 還會順便去填寫 my.exe 的
IAT 每一個元素,我們假設說 IAT[0] 剛好對應 user32!MessageBox 的絕對位址
0x10203040。那必要 my.exe 一開始就知道 Windows 一定會把 IAT[0] 當作
user32!MessageBox 位址的存放處。才能把 call MessageBox 翻譯成
call dword ptr[ IAT[0] ]。
所以其實匯入表四大陣列裡面,又有另外一組陣列叫 INT (Import Name Address) 表。
INT 陣列的每個元素,其資料型態都是『IMAGE_THUNK_DATA』,換言之又是每個元素都是
「四位元組」大小。
可以想成 char *name = "MessageBox";
INT[0] = name;
那只要一開始由編譯器出面,在 my.exe 的匯入表裡面規定說,INT[0] 是代表
user32!MessageBox 函數,就能讓「my.exe 的 .text」跟 Windows Loader 有共同的
認知。我知道要去 IAT[0] 取位址,你也知道要替我把 user32!MessageBox 的最終位址
填進去此處等我拿。
對於 user32!MessageBox,要使用他不是一定要用「隱式連結」,如果用顯式
連結時,是先 LoadLibrary("user32.dll"); 再 GetProcAddree(); 來取得最終位址。
可是在 GetProcAddress() 裡面,可以是一個 "MessageBox" 字串指標,也可以是一個
序數值。只要值介於 0x0000 0000 ~ 0x0000 FFFF 就代表序數;
而 "MessageBox" 對應的字串指標在生成時,他的指標值絕對不會低於 0x0001 0000
所以不會衝突。
剛剛講的隱式連結,只講到 INT 是記錄名稱的「字串指標」,實際上不對,
INT 也有可能是記錄像 user32!MessageBox 的序數值 (0x1DD)。
當 INT 陣列的元素,比如 INT[0] 的最高位元為 1 時,代表 INT[0] 是一個序數值。
在 user32.dll 的匯出表裡面,會記錄 user32.dll!MessageBox 的序數是 0x1DD,
所以如果我在 my.exe 的 INT[0] 看到 0x8000 01DD 我就知道他是 user32!MessageBox。
那為什麼
char *name = "MessageBox";
↑這裡面,得到字串指標不會 >= 0x8000 0000
似乎超過這個位址是 kernel mode 才能用?像記錄每個行程資訊的 EPROCESS 結構
就是在 0x8xxx xxxx 一帶,可用 https://memoryhacking.com 觀看這一帶位址內容。
INT[0] 這四個位元組,可以記載「MessageBox 名稱」或「MessageBox 序數」,實際上
當記錄的是名稱時,他的指標『沒有直接指向字串陣列』!
而是指向「匯入表四大陣列」的其中一個陣列。
這個陣列之前還沒講過,他每個元素的大小是不一定的...
這些元素的資料型態名稱叫 IMAGE_BY_NAME。
前兩個 Bytes 是 Hint,記錄建議序數值用,不用管他。
從第三個 Byte 開始,是 C-Style 字串,內容就是 char str[不一定] = "MessageBox";
簡單來說 INT[0] 的內容如果是 0x00420000,這個指標會指向 IMAGE_BY_NAME 元素。
你不用管他,直接 +3 變成 0x00420003 這個位址就會放置 "MessageBox"。
而匯入表四大陣列的最後一個,他是提供大綱用的,每個元素的資料結構叫
IMAGE_IMPORT_DESCRIPTOR (IID),有 20 個 Bytes 大。
姑且叫最後這個 IID 陣列叫「匯入大綱表」。
如果 my.exe 有用到 user32.dll 跟 kernel32.dll,那麼 IID陣列 就有兩個元素,
char *DLL_NAME1 = "user32.dll";
char *DLL_NAME2 = "kernel32.dll";
IID[0].name = DLL_NAME1;
IID[1].name = DLL_NAME2;
IID[0].originalFirstThunk = 指標 = INT陣列開頭位址
IID[0].FirstThunk = 還是指標 = IAT陣列開頭位址
IID 陣列的目的是給 Windows Loader 看的,當 my.exe 被載入記憶體執行,
Loader 先到匯入表的 IID 陣列知道有兩個模組要載入到 my.exe 的 address space。
當 Loader 載入完後,假設先處理 user32.dll,那就先從 IID[0] 的成員開始處理。
從 IID[0].originalFirstThunk 知道有「user32 專用的 INT 陣列」。
從 IID[0].FirstThunk 知道有「user32 專用的 IAT 陣列」。
從 INT 陣列去知道,只有用到 MessageBox 函數,因此 Loader 去 user32.dll 找出
MessageBox 的最終位址,然後再從對應的 IAT 陣列填寫之。
這樣就完成了 dll 函數的載入時重置工作。
而 my.exe 的 call MessageBox 其實精確說是不用載入時重定位的。
※ 編輯: purpose 來自: 124.8.134.197 (10/10 21:57)
> -------------------------------------------------------------------------- <
作者: coldstars (あら~) 看板: C_and_CPP
標題: Re: [問題] 關於 Position Independent Code 的概念
時間: Sun Oct 10 17:44:32 2010
※ 引述《nowar100 (拋磚引玉)》之銘言:
: 遇到的問題: (題意請描述清楚)
: 本人最近在閱讀某本書,看到動態連結這邊看了老半天,查了一堆資料
: 卻還是沒辦法完全參透他的意思
: 在介紹動態連結的時候
: 他一開始提出的方案為 load time relocation,也就是把重定推遲到載入時才執行
: 後來書上說
: 這樣會讓多個行程無法共用該 DSO,沒有達到節省記憶體空間的好處
: 因此後來出現了 PIC 的概念
: 這樣可以讓 .text 載入的時候不用重定,而 .data 又可以在不同行程有副本
: 這幾句話我看了老半天看不懂
: 1. 為什麼 load time relocation 會造成 DSO 無法被共用?
我覺得他寫錯了,或是你看錯...
即使是PIC的image,也是load的時候才做relocation XD
甚至有些東西還是第一次call到的時候才做
能不能省記憶體主要是靠PIC (gcc是用-fpic/-fPIC的option)
reloc是要解決有些address在執行時才知道的問題
通常都是其他module的位址,所以編譯時當然不知道了...
而每個process載入一個DSO的位址未必相同
例如說今天有libz.so需要libc.so好了
libz裡的reloc,會指向libc.so的某個function
然後我們同時跑起兩隻程式: tar和unzip
這兩隻程式都會需要libz.so (假設啦...我也不知道實際上是怎樣XD)
所以libz.so會同時被load到兩個process裡面去
雖然兩個process都包含了libz.so,裡面又包含了指向libc.so的reloc
但他們實際數字可能不太一樣
如果你的reloc遍佈整個DSO的image,
那即使有多process使用這個DSO,OS也不能把同一份DSO image讓所有process共用
因為DSO image裡有太多page都各自copy-on-write而不能直接mmap
-fpic的作用是讓程式裡access external address的部分
通通移到.text外面,這樣至少.text只佔一份空間
因此其實是對OS來說省記憶體,對process來說沒什麼影響
至於那些.got的section就讓他不停duplicate也無所謂XD
大部分DSO這些section都不會很大,所以還好啦
: 2. .data 裡面的 GOT,書上說在載入的時候 ld.so 會更新裡面欄位的值,
: 這跟多行程能否共用該 DSO,在不同行程有副本又有什麼關係?
被改過以後OS就要幫他copy-on-write,不能讓多process共用
.data/.got這些section本來就沒辦法共用
但如果沒有下-fpic的option,那些需要改的地方就會遍佈整個.text
變成連.text都不能共用了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.42.87.44
修一下例子看能不能比較清楚...
※ 編輯: coldstars 來自: 114.42.87.44 (10/10 18:32)
> -------------------------------------------------------------------------- <
作者: nowar100 (拋磚引玉) 看板: C_and_CPP
標題: Re: [問題] 關於 Position Independent Code 的概念
時間: Sun Oct 10 19:15:51 2010
其實我對於您提出的例子,沒辦法理解,以下是我的謬論(?)
假設 libfoo.so 的 Code 如您所說
int x;
void inc() { ++x; }
那麼在編譯及連結之後, x 應該是長在該 DSO 自己的 .data 區
也就是我推文所講的,應該是可以直接從 .data 的 offset 算出要填入的位址
這應該跟 PIC 無關才對吧,照這樣看,還沒載入之前,位址就應該都是固定的吧
這樣即使 A, B 兩行程同時使用 libfoo.so,該 DSO 的 .text 應該也是固定的阿
我以為,只有在 libfoo.so 參考其他 libbar.so 這種情況下
PIC 才會對 load time relocation 有差別吧
感覺還是似懂非懂,麻煩前輩們請多再指教
※ 引述《littleshan (我要加入劍道社!)》之銘言:
: ※ 引述《nowar100 (拋磚引玉)》之銘言:
: : 遇到的問題: (題意請描述清楚)
: : 本人最近在閱讀某本書,看到動態連結這邊看了老半天,查了一堆資料
: : 卻還是沒辦法完全參透他的意思
: 先猜那本書就是「程式設計師的自我修養」XD
: : 在介紹動態連結的時候
: : 他一開始提出的方案為 load time relocation,也就是把重定推遲到載入時才執行
: : 後來書上說
: : 這樣會讓多個行程無法共用該 DSO,沒有達到節省記憶體空間的好處
: : 因此後來出現了 PIC 的概念
: : 這樣可以讓 .text 載入的時候不用重定,而 .data 又可以在不同行程有副本
: : 這幾句話我看了老半天看不懂
: : 1. 為什麼 load time relocation 會造成 DSO 無法被共用?
: 假設有一段 code 是這樣:
: int x; // global variable
: void inc()
: {
: ++x;
: }
: compile 的時候,因為 x 的位址無法確定
: 所以 inc 的指令會像這樣
: .code
: inc:
: mov XXXX, %eax
: inc %eax
: mov %eax, XXXX
: 其中 XXXX 代表變數 x 的位址,這個位址要交給 linker 決定後再填入
: 假設有兩支程式 A 和 B 都會用到 inc()
: 那麼在執行 A 的時候
: ld.so 會進行一次 relocation
: 並且把 XXXX 代換成 x 真正在記憶體中的位址
: 所以 inc 這段函式載入到記憶體後可能長這樣:
: .code
: inc:
: mov 0x0004, %eax (這邊的意思是把 0x0004 這個位址的內容放進 %eax)
: inc %eax (很久沒寫組語了,語法小錯誤請多見諒)
: mov %eax, 0x0004
: OK,現在 A 還沒跑玩,使用者又執行了 B 程式
: ld.so 又進行第二次 relocation
: 不幸的是 B 這支程式包含了許多其它模組,因此 ld.so 把 x 分配到 0x2000 這個位址
: 這麼一來 inc() 會變這樣:
: .code
: inc:
: mov 0x2000, %eax
: inc %eax
: mov %eax, 0x2000
: 也就是說,如果不使用 Position independent code
: 那麼 inc 這個函式編譯出來的碼
: 與不同的程式連結時,其指令的內容也會跟著不同
: 這麼一來 inc 這個函式勢必在記憶體中要有兩份副本
: 一份是給 A 用的 (x位址為 0x0004的版本)
: 另一份是給 B 用的 (x位址為 0x2000的版本)
: : 2. .data 裡面的 GOT,書上說在載入的時候 ld.so 會更新裡面欄位的值,
: : 這跟多行程能否共用該 DSO,在不同行程有副本又有什麼關係?
: GOT 的目的是為了讓這個 DSO 可以存取另一個 DSO 中的 data
: 考慮一下上面的例子
: 如果 x 是定義於另一個 DSO 中的資料
: 同時我們又希望「存取 x 的指令本身是 position independent」
: 那方法就是繞一圈:先取得 GOT 的位址 (GOT 對於 DSO 來說算是定義於模組內的資料)
: 然後再從 GOT 的內容 (由ld.so填入) 去取得 x 的位址
這部分也因為上面沒參透,不懂為什麼 x 的位址需要動態來取得
等第一題我先解決了再來研究
: : 短短幾頁就讓我無法頓悟,希望對這方面有心得的前輩可以多多幫忙一下
: : 謝謝大家
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.250.174.228
> -------------------------------------------------------------------------- <
作者: littleshan (我要加入劍道社!) 看板: C_and_CPP
標題: Re: [問題] 關於 Position Independent Code 的概念
時間: Mon Oct 11 00:24:33 2010
※ 引述《nowar100 (拋磚引玉)》之銘言:
: 其實我對於您提出的例子,沒辦法理解,以下是我的謬論(?)
: 假設 libfoo.so 的 Code 如您所說
: int x;
: void inc() { ++x; }
: 那麼在編譯及連結之後, x 應該是長在該 DSO 自己的 .data 區
: 也就是我推文所講的,應該是可以直接從 .data 的 offset 算出要填入的位址
: 這應該跟 PIC 無關才對吧,照這樣看,還沒載入之前,位址就應該都是固定的吧
: 這樣即使 A, B 兩行程同時使用 libfoo.so,該 DSO 的 .text 應該也是固定的阿
: 我以為,只有在 libfoo.so 參考其他 libbar.so 這種情況下
: PIC 才會對 load time relocation 有差別吧
: 感覺還是似懂非懂,麻煩前輩們請多再指教
如果你有看過 x86 的 machine code 格式
大概不會有這樣的疑問
比如說 ++x 的命令
在不使用 PIC 的情況下編成 machine code 後會長這樣:
(以下是我編出 .exe 後再用 dumpbin 進行反組譯後的結果)
00401003: A1 C0 BD 40 00 mov eax,dword ptr ds:[0040BDC0h]
00401008: 83 C0 01 add eax,1
0040100B: A3 C0 BD 40 00 mov dword ptr ds:[0040BDC0h],eax
其中 0x0040BDC0 就是 x 的位址
根據 x86 指令集的規格
這個位址必需是絕對位置
也就是 x 真正在 virtual memory space 中的位置
而不是「相對於某個地方的 offset」
所以
只要 libfoo.so 被 ld.so 載入到記憶體中的不同位置
x 的絕對位址就會隨之變動
導致上面的 machine code 必需改寫
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.80.53
> -------------------------------------------------------------------------- <
作者: coldstars (あら~) 看板: C_and_CPP
標題: Re: [問題] 關於 Position Independent Code 的概念
時間: Mon Oct 11 00:48:18 2010
※ 引述《nowar100 (拋磚引玉)》之銘言:
: 其實我對於您提出的例子,沒辦法理解,以下是我的謬論(?)
: 假設 libfoo.so 的 Code 如您所說
: int x;
: void inc() { ++x; }
: 那麼在編譯及連結之後, x 應該是長在該 DSO 自己的 .data 區
: 也就是我推文所講的,應該是可以直接從 .data 的 offset 算出要填入的位址
: 這應該跟 PIC 無關才對吧,照這樣看,還沒載入之前,位址就應該都是固定的吧
: 這樣即使 A, B 兩行程同時使用 libfoo.so,該 DSO 的 .text 應該也是固定的阿
: 我以為,只有在 libfoo.so 參考其他 libbar.so 這種情況下
: PIC 才會對 load time relocation 有差別吧
: 感覺還是似懂非懂,麻煩前輩們請多再指教
但是DSO並不知道自己會被載入到哪個位址
所以位址固定,其實對DSO來說應該是 "在我自己的範圍裡,位址固定"
假設DSO的起點 = base
那這個image大概會長這樣
base:
.data:
// TYPE NAME
int32 x
...
...
.text:
inc:
load [x] -> %r0
add %r0, %r0, 1
store [x] <- %r0
ret
指令請自行想像XD
然後 load x -> %r0 要怎麼知道x的位址呢?
因為編譯時不知道base是多少,
如果不選擇編譯成PIC的話,直接hard-coded進去是最省的
這樣子就違反.text跟位址無關的原則了
編譯成PIC的話,實際上可能得這樣做
_tmp:
move %base -> %r0 // 找出我的base
add %r0, offset(x) -> %r0
load %r0 -> %r0 // 從%r0裡的address讀出值
這部分在各種平台可能有很不同的做法,並非每個平台都有這個%base可用
所以很多平台是用當前的PC來算
畢竟inc()跟x的距離是固定的,加上一個常數就可以找到x
像ARM在data access方面也支援PC-relative addressing mode
他就不需要特地取PC也能直接讀到x的值
x86的話就需要迂迴一點去取PC了
call _this
_this:
pop %eax
這樣就可以把PC騙到%eax裡
(gcc是call進一個小function,然後mov [%esp] -> %ebx)
接著就是 addr(x) = _this - (offset(_this) - offset(x))
以上是static int x的處理方式
跟int x是不一樣的,不過先不要管這麼多好了XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.42.87.44
... <看更多>