專利名稱:通過不可見接口實現(xiàn)不符合abi特征的方法和系統(tǒng)的制作方法
通過不可見接口實現(xiàn)不符合ABI特征的方法和系統(tǒng)
背景技術(shù):
在計算機(jī)程序中,第一編譯模塊的調(diào)用例程可以通過接口向單獨編譯的第二編譯模塊的被調(diào)用例程傳遞一個或更多個參數(shù)的組,并且編譯模塊可以隨后被鏈接以在計算機(jī)系統(tǒng)中執(zhí)行。接口可以符合公認(rèn)規(guī)范或標(biāo)準(zhǔn),諸如應(yīng)用程序二進(jìn)制接口(ABI)。ABI可以描述計算機(jī)程序之間的底層接口,并且可以處理調(diào)用規(guī)范細(xì)節(jié),例如數(shù)據(jù)類型、大小、對齊,以控制函數(shù)變量或者參數(shù)的傳遞與返回。在WindowsIA-32和Linux調(diào)用規(guī)范下,例如,函數(shù)參數(shù)在調(diào)用堆棧上被傳遞。底層軟件編寫者或編譯器可以構(gòu)建不遵循規(guī)范的接口,或修改現(xiàn)有接口以使得接口不再遵循規(guī)范。在32位Windows或Linux環(huán)境中,例如,接口可以被修改為通過寄存器傳遞參數(shù)以避免與調(diào)用堆棧相關(guān)聯(lián)的存儲器加載/存儲操作。傳統(tǒng)上,當(dāng)修改器(編程器或編譯器)能夠訪問被調(diào)用例程和被調(diào)用例程的所有調(diào)用例程時,接口可以被構(gòu)造或修改為與規(guī)范相反。在不是所有的調(diào)用例程都可用時,可用的調(diào)用例程的接口可以被修改,假設(shè)被調(diào)用例程被配置為適應(yīng)所修改的接口和規(guī)范接口二 者,其可以由其他調(diào)用例程使用。換句話說,被調(diào)用例程和至少一個調(diào)用例程被修改。
圖1是包括第一和第二代碼模塊和相對應(yīng)的第一和第二編譯模塊的計算環(huán)境的圖形描述。圖2是包括調(diào)用例程和存根例程的編譯模塊的圖形描述。圖3是包括被調(diào)用例程的編譯模塊的圖形描述。圖4是編譯一代碼模塊的方法的流程圖,該代碼模塊可以包括調(diào)用例程和/或被調(diào)用例程。圖5是編譯一代碼模塊以通過多個接口中的一個接口從調(diào)用例程向另一個編譯模塊的被調(diào)用例程傳遞參數(shù)組的方法流程圖。圖6是編譯一代碼模塊以向被調(diào)用例程提供多個入口點以通過多個相對應(yīng)的接口中的一個接口接收參數(shù)組的方法的流程圖。圖7是將第一編譯模塊的調(diào)用例程鏈接到第二編譯模塊的被調(diào)用例程的方法的流程圖。圖8是包括圖2和圖3中的編譯模塊的計算機(jī)系統(tǒng)的圖形描述,其中調(diào)用例程的調(diào)用被鏈接到被調(diào)用例程的備選入口點。圖9是包括圖2的編譯模塊和圖1的編譯模塊的另一個計算機(jī)程序的圖形描述, 其中調(diào)用例程的調(diào)用被鏈接到存根例程,并且存根例程的調(diào)用被鏈接到被調(diào)用例程的入口
點ο圖10是包括調(diào)用例程用以通過單個接口傳遞來自多個相對應(yīng)的位置的多個參數(shù)的編譯模塊的圖形描述。
圖11是包括調(diào)用例程用以通過多個接口中的一個接口來選擇性傳遞參數(shù)組的另一個編譯模塊的圖形描述。圖12是被配置為編譯一代碼模塊并鏈接一編譯模塊的計算機(jī)系統(tǒng)的框圖。附圖中,最左邊附圖標(biāo)記標(biāo)識了其中第一次出現(xiàn)該附圖標(biāo)記的圖。
具體實施例方式本文公開了方法和系統(tǒng),其配置具有多個接口的調(diào)用例程以將參數(shù)組傳遞到單獨編譯的被調(diào)用例程,并且基于被調(diào)用例程的配置通過多個接口中的一個或更多個接口而鏈接一編譯調(diào)用例程和一編譯被調(diào)用例程。多個接口可以包括規(guī)范接口(interface by convention)和備選接口(alternate interface)。本文還公開了方法和系統(tǒng),其配置具有多個入口點的被調(diào)用例程以通過多個對應(yīng)接口中的一個接口從另一個編譯模塊接收參數(shù)組。圖1是分別包括第一和第二代碼模塊102和104的計算環(huán)境100的圖形描述。代碼模塊102和104可以包括源級代碼和/或中間級代碼。代碼模塊102包括調(diào)用例程106,該調(diào)用例程106具有對代碼模塊104的被調(diào)用例程110的調(diào)用108。調(diào)用108可以包括名字112以及在運行時要被傳遞給被調(diào)用例程110的一個或更多個參數(shù)(例如,PARMl和PARM2)的組114的指示或標(biāo)識。被調(diào)用例程110可以包括函數(shù)代碼111,用以執(zhí)行與參數(shù)組相關(guān)的一個或更多個函數(shù)。環(huán)境100可以包括編譯器116,用以將一代碼模塊102和104編譯為相對應(yīng)的第一和第二編譯模塊118和120。可替代地,代碼模塊102和104之一可以由另一個編譯器編譯。編譯模塊118和120可以包括機(jī)器可讀代碼。編譯模塊118包括與調(diào)用例程106相對應(yīng)的調(diào)用例程122。調(diào)用例程122包括與調(diào)用例程106的調(diào)用108相對應(yīng)的調(diào)用126。編譯模塊120包括與被調(diào)用例程110相對應(yīng)的被調(diào)用例程124,該被調(diào)用例程124 具有用名字112標(biāo)識的入口點125。被調(diào)用例程124還包括與函數(shù)代碼111相對應(yīng)的函數(shù)代碼128。當(dāng)代碼模塊102和104被彼此單獨編譯時,調(diào)用例程122和被調(diào)用例程124可以被配置為根據(jù)規(guī)范和/或標(biāo)準(zhǔn)而傳遞參數(shù)組114,這可以包括但不限于在調(diào)用堆棧上傳遞參數(shù)。在圖1的例子中,調(diào)用例程122包括接口代碼130,用以通過調(diào)用堆棧傳遞參數(shù)組 114,并且被調(diào)用例程124包括接口代碼132,用以在進(jìn)入一入口點125后通過調(diào)用堆棧接收參數(shù)組114。調(diào)用堆棧和任何格式化要求可以被稱為接口。編譯器116包括規(guī)范接口構(gòu)造器142,用以根據(jù)規(guī)范構(gòu)造接口代碼130,以及規(guī)范入口點構(gòu)造器144,用以根據(jù)規(guī)范構(gòu)造入口點125和相對應(yīng)的接口代碼132??商娲?,當(dāng)編譯模塊118或者編譯模塊120由另一個編譯器生成,相對應(yīng)的接口代碼可以由其他的編譯器生成。環(huán)境100可以包括鏈接系統(tǒng)136,用以鏈接編譯模塊118和120,以允許計算機(jī)系統(tǒng)將編譯模塊118和120作為集成計算機(jī)程序137來執(zhí)行。圖1包括從調(diào)用1 到被調(diào)用例程124的入口點125的鏈接138。在一些情況下,可以希望通過不符合規(guī)范的備選接口傳遞參數(shù)。例如,在圖1中, 被調(diào)用例程124的接口代碼132被配置為將參數(shù)組114從調(diào)用堆棧分別加載到寄存器Rl 和R2。函數(shù)代碼1 可以被配置為訪問寄存器Rl和R2中的參數(shù)。在這種情況下,可以希望配置調(diào)用例程122和被調(diào)用例程124以通過寄存器Rl和R2傳遞參數(shù)組114。編譯器116可以包括備選入口點構(gòu)造器145,用以構(gòu)造被調(diào)用例程中的備選入口點,例如下文參照圖3所描述的。編譯器116還可以包括備選接口構(gòu)造器146,用以構(gòu)造被調(diào)用例程中的備選接口和相對應(yīng)的對備選入口點的備選調(diào)用,例如下文參照圖2所描述的。編譯器116可以被配置為針對調(diào)用例程構(gòu)造一規(guī)范接口和一備選接口,其可以允許調(diào)用例程調(diào)用一適當(dāng)修改的被調(diào)用例程或者一無修改的被調(diào)用例程。類似的,編譯器116可以被配置為針對被調(diào)用例程構(gòu)造規(guī)范入口點、相對應(yīng)的規(guī)范接口和備選入口點,其可以允許由適當(dāng)修改的調(diào)用例程和無修改的調(diào)用例程來調(diào)用一被調(diào)用例程。鏈接系統(tǒng)136可以被配置為,例如下文參照圖8所描述的,當(dāng)調(diào)用例程和被調(diào)用例程都被適當(dāng)配置時,通過備選接口將調(diào)用例程選擇性鏈接到被調(diào)用例程,否則例如下文參照圖9所描述的,通過規(guī)范接口將調(diào)用例程選擇性鏈接到被調(diào)用例程。在上面例子中,備選接口、備選調(diào)用和備選入口點都被描述為由編譯器116構(gòu)造。 可替代地,備選接口和相對應(yīng)的備選調(diào)用、或者備選入口點可以在編譯后被構(gòu)造,例如響應(yīng)于用戶輸入用機(jī)器代碼編輯器進(jìn)行。圖2是包括調(diào)用例程202和存根例程(stub routine) 204的編譯模塊200的圖形描述。編譯模塊200可以通過編譯器116從圖1中的代碼模塊102生成??商娲兀趫D1中的編譯模塊118由另一個編譯器生成的情況下,圖2中的編譯模塊200可以從編譯模塊118構(gòu)造或者修改,例如響應(yīng)于用戶輸入由機(jī)器代碼編輯器進(jìn)行。調(diào)用例程202包括對名字208的調(diào)用206,在這里被說明為Bar_bair_2。調(diào)用例程202還包括相對應(yīng)的接口代碼210,用以通過第一接口傳遞參數(shù)組114(例如PARMl和 PARM2),所述第一接口在這里被說明為寄存器Rl和R2。第一接口可以對應(yīng)于備選接口,而調(diào)用206可以被稱為備選調(diào)用。名字208可以根據(jù)圖1中的調(diào)用例程106的名字112來生成。名字208還可以根據(jù)第一接口的名字和參數(shù)組114中參數(shù)的數(shù)目來生成。例如,“bair”可以表示“寄存器中的盲變量(blind arguments in registers) ”,“2”可以表示參數(shù)組114中的參數(shù)的數(shù)目。 名字208可以被稱為備選名字。存根例程204包括對名字112的調(diào)用126,以及相對應(yīng)的接口代碼218,用以通過第二接口(例如調(diào)用堆棧)傳遞來自第一接口(例如Rl和R2)的參數(shù)組114。接口代碼 218可以對應(yīng)于規(guī)范接口。存根例程204可以與調(diào)用例程202相關(guān)聯(lián)以允許鏈接系統(tǒng)136來將調(diào)用例程202 鏈接到存根例程204。例如,存根例程204的入口點212可以被命名為備選名字208的“弱”版本,在這里說明為weak. Bar_bair_2。圖3是包括被調(diào)用例程302的編譯模塊300的圖形描述。編譯模塊300可以由編譯器116從圖1的代碼模塊104生成??商娲?,在圖1 中的編譯模塊120由另一編譯器生成的情況下,編譯模塊300可以從編譯模塊120構(gòu)造或者修改,例如響應(yīng)于用戶輸入由機(jī)器代碼編輯器進(jìn)行。被調(diào)用例程302包括入口點125,并且相對應(yīng)的接口代碼132通過調(diào)用堆棧接收參數(shù)組114,例如上文參照圖1中的被調(diào)用例程IM所描述的。入口點125可以對應(yīng)于規(guī)范入口點,并且接口代碼132可以對應(yīng)于規(guī)范接口。被調(diào)用例程302可以包括備選入口點304,這里說明為在接口代碼132和函數(shù)代碼 1 之間。接口代碼132可以被配置為將參數(shù)組114從調(diào)用堆棧移動到寄存器Rl和R2,以及函數(shù)代碼1 可以被配置為訪問在寄存器Rl和R2處的參數(shù)組114,例如上文參照圖1中的被調(diào)用例程1 所描述的。在這種情況下,備選入口點304不需要對應(yīng)的接口代碼。在其他情況下,入口點 304可以包括接口代碼,用以重定位和/或格式化參數(shù)組114。下面將參照圖4-7以及參照本文一個或更多個其它例子而公開示例方法。然而, 圖4-7的例子并不限于這些其他例子。圖4是編譯一代碼模塊的方法400的流程圖,該代碼模塊可以包括調(diào)用例程和/ 或被調(diào)用例程。在402,接收代碼模塊。在圖1中,編譯器116可以接收代碼模塊102和/或代碼模塊104。在404,評估代碼模塊中的調(diào)用例程,例如圖1中的調(diào)用例程106。在調(diào)用例程調(diào)用未出現(xiàn)在代碼模塊中的名字的情況下,處理進(jìn)行到406,在406根據(jù)下文描述的圖5來編譯調(diào)用例程。可以針對一個或更多個另外的調(diào)用例程而重復(fù)在404的評估和在406的編譯。在408,評估代碼模塊中的被調(diào)用例程。在可以從代碼模塊外部調(diào)用該被調(diào)用例程的情況下,處理進(jìn)行到410,在410根據(jù)下文描述的圖6來編譯被調(diào)用例程??梢葬槍σ粋€或更多個另外的被調(diào)用例程而重復(fù)在408的評估和在410的編譯。在412,代碼模塊的其他代碼例如可以根據(jù)傳統(tǒng)編譯技術(shù)被編譯。上面參照圖4公開的特征和/或其部分可以用彼此相對的各種序列中的一種或更多種序列來執(zhí)行,彼此并行地執(zhí)行,和/或以綜合方式來執(zhí)行。圖5是編譯一代碼模塊以通過多個接口中的一個接口從調(diào)用例程向另一編譯模塊的被調(diào)用例程傳遞參數(shù)組的方法500的流程圖。在502,調(diào)用例程在代碼模塊中被識別為具有對未在代碼模塊中出現(xiàn)的名字的調(diào)用。在504,生成備選點名字。備選點名字可以根據(jù)調(diào)用名字、第一接口的指示、和通過第一接口傳遞的參數(shù)的數(shù)目來生成。在506,生成備選名字的弱版本,例如上文參照圖2中的入口點212所描述的。在508,調(diào)用例程被編譯以調(diào)用備選名字并且通過第一接口傳遞參數(shù)組,例如上文參照圖2中的調(diào)用例程202所描述的。
在510,第一代碼模塊被編譯以包括存根例程,用以調(diào)用所述名字并且通過第二接口傳遞來自第一接口的參數(shù)組。存根例程或者存根例程的入口點用備選名字的弱版本被標(biāo)識,例如上文參照圖2中的存根例程204所描述的。圖6是編譯一代碼模塊以向被調(diào)用例程提供多個入口點以通過多個對應(yīng)接口中的一個接口接收參數(shù)組的方法600的流程圖。在602,被調(diào)用例程在代碼模塊中被標(biāo)識為可從代碼模塊外部被調(diào)用。在604,生成備選入口點名字。備選入口點名字可以根據(jù)被調(diào)用例程的名字、備選接口的指示和通過備選接口傳遞的參數(shù)的數(shù)目來生成。在606,被調(diào)用例程被編譯為包括第一入口點,用于通過規(guī)范接口接收參數(shù)組,和備選入口點,用于通過備選接口接收參數(shù)組??梢杂帽徽{(diào)用例程的名字標(biāo)識第一入口點,并且可以用備選入口點名字標(biāo)識備選入口點,例如上文參照圖3中的被調(diào)用例程302所描述的。圖7是將第一編譯模塊的調(diào)用例程鏈接到第二編譯模塊的被調(diào)用例程的方法700 的流程圖。在702,例如在圖1的鏈接系統(tǒng)136處,接收第一和第二編譯模塊。第一編譯模塊可以對應(yīng)于圖2中的編譯模塊200。第二編譯模塊可以對應(yīng)于圖1的編譯模塊120或者圖 3的編譯模塊300。在704,識別根據(jù)方法600配置的第一編譯模塊的調(diào)用例程和相關(guān)聯(lián)的存根例程。 調(diào)用例程和相關(guān)聯(lián)的存根例程可以對應(yīng)于圖2中的調(diào)用例程202和存根例程200。在706,識別第二編譯模塊的被調(diào)用例程,該被調(diào)用例程具有與存根例程的調(diào)用相對應(yīng)的第一入口點。被調(diào)用例程可以對應(yīng)于圖1中的被調(diào)用例程1 或者圖3中的被調(diào)用例程302。在708,評估被調(diào)用例程。在被調(diào)用例程包括如上面參照圖6中的606所描述的備選入口點的情況下,處理進(jìn)行到710。在被調(diào)用例程不包括這種備選入口點的情況下,處理進(jìn)行到712。在710,調(diào)用例程鏈接到被調(diào)用例程的備選入口點。圖8是計算機(jī)程序800的圖形描述,計算機(jī)程序800包括圖2的編譯模塊200和圖3的編譯模塊300,其中調(diào)用206用鏈接802被鏈接到被調(diào)用例程302的備選入口點304。在712,調(diào)用例程被鏈接到存根例程,且存根例程被鏈接到被調(diào)用例程的第一入口點。圖9是計算機(jī)程序900的圖形描述,包括圖2的編譯模塊200和圖1的編譯模塊120, 其中調(diào)用206用鏈接902被鏈接到存根例程204,并且存根例程204的調(diào)用1 用鏈接904 被鏈接到被調(diào)用例程124的入口點125。在上面的例子中,兩個參數(shù)(PARM1和PAR1C)通過寄存器Rl和R2或者通過調(diào)用堆棧來傳遞。然而,此處公開的方法和系統(tǒng)并不局限于寄存器或者調(diào)用堆棧。備選接口可以被配置為執(zhí)行任務(wù)和/或邏輯操作。下面公開了示例任務(wù)和邏輯操作。然而,備選接口并不局限于下述例子。備選接口可以被構(gòu)造為組合來自多個位置的多個參數(shù),并且通過單個位置傳遞組合參數(shù),例如如下面參照圖10所描述的。備選接口可以被構(gòu)造為通過多個可選擇的接口中的一個接口傳遞參數(shù)組,例如如下面參照圖11所描述的。備選接口可以被構(gòu)造為通過第一接口傳遞第一參數(shù)組以及通過第二接口傳遞第
二參數(shù)組。圖10是編譯模塊1000的圖形描述,包括調(diào)用例程1002和存根例程1004。調(diào)用例程1002可以包括備選調(diào)用1006和相對應(yīng)的備選接口代碼1008,用以通過單個備選接口 (這里被說明為寄存器Rl)傳遞來自多個位置的多個參數(shù)。備選接口代碼1006可以被配置為在加載到寄存器之前組合或者操縱參數(shù)。存根例程1004可以配置為按規(guī)范傳遞多個參數(shù),例如上面一個或更多個例子所描述的。圖11是編譯模塊1100的圖形描述,包括調(diào)用例程1102和存根例程1104。調(diào)用例程1102包括多個備選調(diào)用1106和1108,被指向被調(diào)用例程的相應(yīng)多個備選入口點。備選調(diào)用1106包括備選接口代碼1110,用以通過第一備選接口(此處說明為寄存器Rl和R2) 傳遞參數(shù)組。備選調(diào)用1108包括備選接口代碼1112,用以組合參數(shù)組并且通過第二備選接口(此處被說明為寄存器Rl)傳遞組合參數(shù)組。調(diào)用例程1102還包括狀態(tài)確定邏輯(contingency logic) 1114和1116,用以基于狀態(tài)(contingency) “Α”來選擇性調(diào)用備選調(diào)用1106或者備選調(diào)用1108。狀態(tài)可以涉及一個或更多個參數(shù)的值和/或一個或更多個條件。存根例程1104可以配置為當(dāng)被調(diào)用例程不包括備選入口點時根據(jù)規(guī)范傳遞參數(shù)組。本文公開的一個或更多個特征可以用硬件、軟件、固件以及其結(jié)合實現(xiàn),包括分立或者集成電路邏輯、專用集成電路(ASIC)邏輯和微控制器,并且可以被實現(xiàn)為特定領(lǐng)域集成電路封裝的部分、或者集成電路封裝的結(jié)合。如本文所使用的術(shù)語軟件、代碼和指令是指計算機(jī)程序產(chǎn)品,其包括其中存儲有計算機(jī)程序邏輯的計算機(jī)可讀介質(zhì),以使得計算機(jī)系統(tǒng)執(zhí)行本文公開的一個或更多個特征和/或特征的結(jié)合。圖12是示例性計算機(jī)系統(tǒng)1200的框圖,包括一個或更多個計算機(jī)指令處理單元 (如這里所說明的處理器1202)以執(zhí)行計算機(jī)程序產(chǎn)品邏輯。計算機(jī)系統(tǒng)1200包括一個或更多個存儲器、高速緩存、寄存器和存儲設(shè)備(下文稱為“存儲器”)1204。存儲器1204包括計算機(jī)可讀介質(zhì),其上存儲有計算機(jī)程序產(chǎn)品邏輯1206以使得處理器1202響應(yīng)于其而執(zhí)行一個或更多個功能。存儲器1204還包括由處理器1202在執(zhí)行邏輯1206中使用的數(shù)據(jù)1208、和/或由處理器1202響應(yīng)于對邏輯1206的執(zhí)行而生成的數(shù)據(jù)1208。數(shù)據(jù)1208可以包括圖1中的代碼模塊102和/或代碼模塊104。邏輯1206包括編譯器邏輯1210,用以使得處理器1202編譯一代碼模塊102和/ 或一代碼模塊104以生成相對應(yīng)的編譯模塊200和300,例如上文一個或更多個例子中所描述的??商娲兀a模塊102或代碼模塊104可以被另一個編譯器編譯以分別生成編譯模塊118或者編譯模塊120。編譯器邏輯1210可以包括規(guī)范接口邏輯1212以使得處理器1202生成接口代碼以允許調(diào)用例程按照規(guī)范傳遞參數(shù)組,例如上文一個或更多個例子中所描述的。編譯器邏輯1210可以包括備選接口邏輯1214以使得處理器1202生成備選接口代碼以允許調(diào)用例程通過備選接口傳遞參數(shù)組,例如上文一個或更多個例子中所描述的。編譯器邏輯1210可以包括規(guī)范入口點邏輯1216以使得處理器1202構(gòu)造入口點和相對應(yīng)的接口代碼來允許被調(diào)用例程按規(guī)范接收參數(shù)組,例如上文一個或更多個例子中所描述的。編譯邏輯1210可以包括備選入口點邏輯1218以使得處理器1202構(gòu)造備選入口以允許被調(diào)用例程通過備選接口接收參數(shù)組,例如上文一個或更多個例子中所描述的。邏輯1206可以包括鏈接邏輯1220以使得處理器1202鏈接多個編譯模塊,這包括選擇性鏈接調(diào)用例程到被調(diào)用例程的備選入口點,或者通過存根例程鏈接調(diào)用例程到被調(diào)用例程,例如上文一個或更多個例子中所描述的。計算機(jī)系統(tǒng)1200可以包括通信基礎(chǔ)設(shè)施1240,用以在計算機(jī)系統(tǒng)1200內(nèi)進(jìn)行通信,以及輸入/輸出控制器1242,用以通過諸如因特網(wǎng)的網(wǎng)絡(luò)通信系統(tǒng)連接一個或更多個其他計算機(jī)系統(tǒng)。本文借助于功能構(gòu)建塊來公開方法和系統(tǒng),以說明其功能、特征以及關(guān)系。為了描述的方便,一個或更多這種劃分可以在本文被任意定義。可替代的劃分可以被定義。雖然本文公開了各種實施例,但是應(yīng)該理解作為示例而非限制呈現(xiàn)了這些實施例。在不脫離本文所公開的系統(tǒng)和方法的精神和范圍的情況下,可以在其中進(jìn)行形式和細(xì)節(jié)上的各種改變,這對相關(guān)領(lǐng)域技術(shù)人員將是顯而易見的。所以,權(quán)利要求的寬度和范圍并不被本文公開的任何例子所限制。
權(quán)利要求
1.一種系統(tǒng),包括編譯器,用于從代碼模塊生成第一編譯模塊,包括 識別調(diào)用在所述第一代碼模塊中沒有出現(xiàn)的名字的調(diào)用例程, 根據(jù)所述名字生成備選名字,并且生成所述備選名字的弱版本, 編譯所述調(diào)用例程以通過第一接口傳遞一個或更多個參數(shù)的組并且調(diào)用所述備選名字,并且編譯所述第一代碼模塊以包括存根例程,該存根例程具有用所述備選名字的所述弱版本標(biāo)識的入口點,并且配置為通過第二接口傳遞來自所述第一接口的所述參數(shù)組并調(diào)用所述名字。
2.如權(quán)利要求1所述的系統(tǒng),還包括鏈接系統(tǒng),用于將所述第一編譯模塊與第二編譯模塊鏈接,所述第二編譯模塊包括具有用所述名字標(biāo)識的第一入口點的被調(diào)用例程,其中所述鏈接系統(tǒng)被配置為,當(dāng)所述被調(diào)用例程包括備選入口點時,將所述調(diào)用例程鏈接到具有所述備選名字的所述被調(diào)用例程的所述備選入口點,并且當(dāng)所述被調(diào)用例程不包括所述備選入口點時,將所述調(diào)用例程鏈接到所述存根例程的所述入口點并且將所述存根例程鏈接到所述被調(diào)用例程的所述第一入口點。
3.如權(quán)利要求1所述的系統(tǒng),其中所述編譯器還被配置為 識別所述第一代碼模塊中的被調(diào)用例程,根據(jù)所識別的被調(diào)用例程的名字生成備選入口點名字,并且編譯所識別的被調(diào)用例程以包括第一入口點,所述第一入口點具有所述被調(diào)用例程的所述名字并且被配置為通過所述第二接口接收所述參數(shù)組,并且包括備選入口點,所述備選入口點具有所述備選入口點名字并被配置為通過所述第一接口接收所述參數(shù)組。
4.如權(quán)利要求1所述的系統(tǒng),其中所述第二接口符合規(guī)范并且所述第一接口不符合所述規(guī)范。
5.如權(quán)利要求1所述的系統(tǒng),其中所述第一接口對應(yīng)于寄存器并且所述第二接口對應(yīng)于調(diào)用堆棧。
6.如權(quán)利要求1所述的系統(tǒng),其中所述編譯器還被配置為根據(jù)所述名字、所述第一接口的指示和所述參數(shù)組中的參數(shù)的數(shù)目生成所述備選名字。
7.一種方法,包括編譯代碼模塊以生成第一編譯模塊,包括識別調(diào)用在所述第一代碼模塊中沒有出現(xiàn)的名字的調(diào)用例程,根據(jù)所述名字生成備選名字,生成所述備選名字的弱版本,編譯所述調(diào)用例程以通過第一接口傳遞一個或更多個參數(shù)的組,并且調(diào)用所述備選名字,并且編譯所述第一代碼模塊以包括存根例程,所述存根例程具有用所述備選名字的所述弱版本標(biāo)識的入口點,并且配置為通過第二接口傳遞來自所述第一接口的所述參數(shù)組并調(diào)用所述名字;其中,在適當(dāng)編程的計算機(jī)系統(tǒng)中執(zhí)行所述編譯。
8.如權(quán)利要求7所述的方法,還包括將所述第一編譯模塊與第二編譯模塊鏈接,所述第二編譯模塊包括具有用所述名字標(biāo)識的第一入口點的被調(diào)用例程,包括當(dāng)所述被調(diào)用例程包括備選入口點時,將所述調(diào)用例程鏈接到具有所述備選名字的所述被調(diào)用例程的所述備選入口點,并且當(dāng)所述被調(diào)用例程不包括所述備選入口點時,將所述調(diào)用例程鏈接到所述存根例程的所述入口點并且將所述存根例程鏈接到所述被調(diào)用例程的所述第一入口點。
9.如權(quán)利要求7所述的方法,其中所述編譯還包括識別所述第一代碼模塊中的被調(diào)用例程;根據(jù)所識別的被調(diào)用例程的名字生成備選入口點名字;并且編譯所識別的被調(diào)用例程以包括第一入口點,所述第一入口點具有所述被調(diào)用例程的所述名字并且被配置為通過所述第二接口接收所述參數(shù)組,并且包括備選入口點,所述備選入口點具有所述備選入口點名字并被配置為通過所述第一接口接收所述參數(shù)組。
10.如權(quán)利要求7所述的方法,其中所述編譯還包括編譯所述調(diào)用例程以通過多個接口中所選的一個接口來傳遞所述參數(shù)組。
11.如權(quán)利要求10所述的方法,其中所述編譯還包括編譯所述調(diào)用例程以基于所述參數(shù)組的參數(shù)的值通過所述多個接口中所選的一個接口來傳遞所述參數(shù)組。
12.如權(quán)利要求7所述的方法,其中所述編譯還包括編譯所述調(diào)用例程以組合來自多個位置的多個參數(shù)并且通過所述第一接口傳遞所述多個參數(shù)。
13.一種計算機(jī)程序產(chǎn)品,包括其上記錄有計算機(jī)程序邏輯的計算機(jī)可讀介質(zhì),所述計算機(jī)程序邏輯包括編譯器邏輯,用于使得計算機(jī)系統(tǒng)編譯一代碼模塊以生成第一編譯模塊,其中所述編譯器邏輯包括使得所述計算機(jī)系統(tǒng)識別調(diào)用在所述第一代碼模塊中沒有出現(xiàn)的名字的調(diào)用例程的邏輯,使得所述計算機(jī)系統(tǒng)根據(jù)所述名字生成備選名字并且生成所述備選名字的弱版本的邏輯,使得所述計算機(jī)系統(tǒng)編譯所述調(diào)用例程以通過第一接口傳遞一個或更多個參數(shù)的組并且調(diào)用所述備選名字的邏輯,并且使得所述計算機(jī)系統(tǒng)編譯所述第一代碼模塊以包括存根例程的邏輯,所述存根例程具有用所述備選名字的所述弱版本標(biāo)識的入口點,并且配置為通過第二接口傳遞來自所述第一接口的所述參數(shù)組并調(diào)用所述名字。
14.如權(quán)利要求13所述的計算機(jī)程序產(chǎn)品,還包括鏈接邏輯,用于使得所述計算機(jī)系統(tǒng)將所述第一編譯模塊與第二編譯模塊鏈接,所述第二編譯模塊包括具有用所述名字標(biāo)識的入口點的被調(diào)用例程,其中所述鏈接邏輯包括用于使得所述處理器系統(tǒng)進(jìn)行以下的邏輯當(dāng)所述被調(diào)用例程包括備選入口點時,將所述調(diào)用例程鏈接到具有所述備選名字的所述被調(diào)用例程的所述備選入口點,并且當(dāng)所述被調(diào)用例程不包括所述備選入口點時,將所述調(diào)用例程鏈接到所述存根例程的所述入口點并且將所述存根例程鏈接到所述被調(diào)用例程的所述第一入口點。
15.如權(quán)利要求13所述的計算機(jī)程序產(chǎn)品,其中所述編譯器邏輯還包括 使得所述計算機(jī)系統(tǒng)識別所述第一代碼模塊中的被調(diào)用例程的邏輯;使得所述計算機(jī)系統(tǒng)根據(jù)所識別的被調(diào)用例程的名字生成備選入口點名字的邏輯;并且使得所述計算機(jī)系統(tǒng)編譯所識別的被調(diào)用例程以包括第一入口點并且包括備選入口點的邏輯,所述第一入口點具有所述被調(diào)用例程的所述名字并且被配置為通過所述第二接口接收所述參數(shù)組,所述備選入口點具有所述備選入口點名字并被配置為通過所述第一接口接收所述參數(shù)組。
16.如權(quán)利要求13所述的計算機(jī)程序產(chǎn)品,其中所述第一接口對應(yīng)于寄存器并且所述第二接口對應(yīng)于調(diào)用堆棧。
17.如權(quán)利要求13所述的計算機(jī)程序產(chǎn)品,其中所述編譯器邏輯還包括使得所述計算機(jī)系統(tǒng)根據(jù)所述名字、所述第一接口的指示和所述參數(shù)組中的參數(shù)的數(shù)目生成所述備選名字的邏輯。
18.如權(quán)利要求13所述的計算機(jī)程序產(chǎn)品,其中所述編譯器邏輯還包括使得所述計算機(jī)系統(tǒng)編譯所述調(diào)用例程以通過多個接口中所選的一個接口來傳遞所述參數(shù)組的邏輯。
19.如權(quán)利要求18所述的計算機(jī)程序產(chǎn)品,其中所述編譯器邏輯還包括使得所述計算機(jī)系統(tǒng)編譯所述調(diào)用例程以基于所述參數(shù)組的參數(shù)的值通過多個接口中所選的一個接口來傳遞所述參數(shù)組的邏輯。
20.如權(quán)利要求13所述的計算機(jī)程序產(chǎn)品,其中所述編譯器邏輯還包括使得所述計算機(jī)系統(tǒng)編譯所述調(diào)用例程以組合來自多個位置的多個參數(shù)并且通過所述第一接口傳遞所述多個參數(shù)的邏輯。
全文摘要
公開了多種通過不可見接口實現(xiàn)不符合ABI特征的方法和系統(tǒng),用于編譯一代碼模塊以允許調(diào)用例程將參數(shù)傳遞到單獨編譯的代碼模塊的被調(diào)用例程,并且允許被調(diào)用例程通過多個接口從單獨編譯的代碼模塊的調(diào)用例程接收參數(shù)。接口可以包括規(guī)范接口和備選接口。調(diào)用例程可以被配置為通過備選接口傳遞參數(shù),并且調(diào)用被調(diào)用例程的備選入口點。相關(guān)聯(lián)的存根例程可以被配置為通過規(guī)范接口傳遞參數(shù)并調(diào)用被調(diào)用例程的規(guī)范入口點。如果被調(diào)用例程包括相對應(yīng)的備選入口點,則調(diào)用例程可以被鏈接到備選入口點。否則,被調(diào)用例程可以通過存根例程被鏈接到被調(diào)用例程。
文檔編號G06F9/45GK102222017SQ20111012638
公開日2011年10月19日 申請日期2011年4月13日 優(yōu)先權(quán)日2010年4月13日
發(fā)明者Z·安薩里 申請人:英特爾公司