本技術(shù)涉及計(jì)算機(jī),尤其涉及一種補(bǔ)丁執(zhí)行方法及裝置。
背景技術(shù):
1、進(jìn)程在運(yùn)行中,可能存在缺陷,為了使得進(jìn)程可以正常運(yùn)行,需要修正進(jìn)程中存在的缺陷。若暫停進(jìn)程去修復(fù)缺陷,則會(huì)影響進(jìn)程的性能和進(jìn)程的運(yùn)行速度。如何在進(jìn)程不暫停的情況下,修復(fù)進(jìn)程中存在的缺陷,有待進(jìn)一步研究。
技術(shù)實(shí)現(xiàn)思路
1、本技術(shù)提供了一種補(bǔ)丁執(zhí)行方法及裝置,實(shí)現(xiàn)了補(bǔ)丁文件即可以調(diào)用進(jìn)程中的線程變量,又可以調(diào)用動(dòng)態(tài)庫中的線程變量。
2、第一方面,本技術(shù)提供了一種補(bǔ)丁執(zhí)行方法,其特征在于,方法包括:獲取到補(bǔ)丁文件,補(bǔ)丁文件用于修復(fù)第一進(jìn)程中存在的缺陷,補(bǔ)丁文件中引用有第一線程變量,第一線程變量為第一進(jìn)程或者第一動(dòng)態(tài)庫中定義的線程變量;在補(bǔ)丁文件中新增got表,got表包括第一表項(xiàng)和第二表項(xiàng),第一表項(xiàng)為第一線程變量的偏移量,第二表項(xiàng)為第一線程變量所在模塊的模塊id;獲取到第一線程變量的偏移量為第一偏移量和第一線程變量所在模塊的模塊id為第一id;將第一偏移量和第一id更新至got表中,得到更新補(bǔ)丁文件;運(yùn)行更新補(bǔ)丁文件,通過第一函數(shù)獲取到第一線程變量的地址,第一函數(shù)是通過got表中第一偏移量和第一id獲取到第一線程變量的地址的;通過第一線程變量的地址調(diào)用第一線程變量。
3、這里,第一線程變量所在模塊的模塊id,可以指第一線程變量所在進(jìn)程的進(jìn)程id或者第一線程變量所在動(dòng)態(tài)庫的動(dòng)態(tài)庫id。
4、通過該方法,實(shí)現(xiàn)了補(bǔ)丁文件即可以調(diào)用進(jìn)程中的線程變量,又可以調(diào)用動(dòng)態(tài)庫中的線程變量。
5、結(jié)合第一方面,在一種可能的實(shí)現(xiàn)方式中,在通過第一函數(shù)獲取到第一線程變量的地址之前,方法還包括:獲取到補(bǔ)丁文件中引用第一線程變量的第一指令;在第一指令為非通過函數(shù)獲取第一線程變量的地址的情況下,將第一指令修改為第二指令,第二指令為通過第一函數(shù)獲取到第一線程變量的地址;運(yùn)行更新補(bǔ)丁文件,通過第一函數(shù)獲取到第一線程變量的地址,具體包括:運(yùn)行更新補(bǔ)丁文件并執(zhí)行更新補(bǔ)丁文件中的第二指令,通過第一函數(shù)獲取到第一線程變量的地址。
6、這樣,在第一線程變量為第一進(jìn)程和/或第一動(dòng)態(tài)庫中的線程變量的情況下,若第一指令不是通過函數(shù)獲取第一線程變量的地址,將第一指令修改為第二指令,第二指令是通過系統(tǒng)函數(shù)獲取到第一線程變量的地址的,保證補(bǔ)丁文件可以正常調(diào)用第一進(jìn)程中的第一線程變量,也可以調(diào)用第一動(dòng)態(tài)庫中的第一線程變量。
7、結(jié)合第一方面,在一種可能的實(shí)現(xiàn)方式中,在第一指令為非通過函數(shù)獲取第一線程變量的地址的情況下,將第一指令修改為第二指令,具體包括:在第一指令為非通過函數(shù)獲取第一線程變量的地址且第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,將第一指令修改為第二指令。
8、這樣,僅在第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,將第一指令修改為第二指令,保證補(bǔ)丁文件可以正常調(diào)用第一動(dòng)態(tài)庫中的第一線程變量。
9、結(jié)合第一方面,在一種可能的實(shí)現(xiàn)方式中,方法還包括:在第一線程變量為第一進(jìn)程中定義的線程變量的情況下,運(yùn)行更新補(bǔ)丁文件并執(zhí)行更新補(bǔ)丁文件中的第一指令,獲取到第一線程變量的地址。
10、第一指令為通過第一進(jìn)程獲取到第一線程變量的地址。這樣,在第一線程變量為第一進(jìn)程中定義的線程變量的情況下,第一進(jìn)程可以直接獲取到第一線程變量的地址,從而無需將第一指令修改為第二指令。
11、結(jié)合第一方面,在一種可能的實(shí)現(xiàn)方式中,將第一偏移量和第一id更新至got表中,得到更新補(bǔ)丁文件,具體包括:在加載補(bǔ)丁文件之前,獲取到第一線程變量的偏移量為第一偏移量,將第一線程變量所在模塊的模塊id置為第二值,將第一偏移量和第二值更新至got表中;在加載補(bǔ)丁文件之后,獲取到第一線程變量所在模塊的模塊id為第一值,將got表中第一線程變量所在模塊的模塊id由第二值修改為第一值,得到更新補(bǔ)丁文件。
12、這樣,不區(qū)分第一線程變量為進(jìn)程中的線程變量還是動(dòng)態(tài)庫中的線程變量,均在加載補(bǔ)丁文件之后,再獲取到第一線程變量所在模塊的模塊id。
13、結(jié)合第一方面,在一種可能的實(shí)現(xiàn)方式中,將第一偏移量和第一id更新至got表中,得到更新補(bǔ)丁文件,具體包括:在加載補(bǔ)丁文件之前,在第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,獲取到第一線程變量的偏移量為第一偏移量,將第一線程變量所在模塊的模塊id置為第二值,將第一偏移量和第二值更新至got表中;在加載補(bǔ)丁文件之后,在第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,獲取到第一線程變量所在模塊的模塊id為第一值,將got表中第一線程變量所在模塊的模塊id由第二值修改為第一值,得到更新補(bǔ)丁文件。
14、這樣,需要區(qū)分第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,在第一線程變量為第一動(dòng)態(tài)庫中的線程變量的情況下,在加載補(bǔ)丁文件之后,再獲取到第一線程變量所在第一動(dòng)態(tài)庫的動(dòng)態(tài)庫id。
15、結(jié)合第一方面,在一種可能的實(shí)現(xiàn)方式中,方法還包括:在加載補(bǔ)丁文件之前,在第一線程變量為第一進(jìn)程中定義的線程變量的情況下,獲取到第一線程變量的偏移量為第一偏移量和第一線程變量所在模塊的模塊id為第一id,并將第一偏移量和第一id更新至got表中,得到更新補(bǔ)丁文件。
16、這樣,需要區(qū)分第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,在第一線程變量為第一進(jìn)程中的線程變量的情況下,在加載補(bǔ)丁文件之前,就可以獲取到第一線程變量所在第一進(jìn)程的進(jìn)程id。
17、結(jié)合第一方面,在一種可能的實(shí)現(xiàn)方式中,第一線程控制塊中存儲(chǔ)有第一動(dòng)態(tài)庫中或者第一進(jìn)程中包括第一線程變量所在的段的內(nèi)容,第一線程控制塊用于存儲(chǔ)第一線程調(diào)用第一線程變量的數(shù)據(jù),第一id為第一動(dòng)態(tài)庫的動(dòng)態(tài)庫id或者第一進(jìn)程的進(jìn)程id;通過第一函數(shù)獲取到第一線程變量的地址,具體包括:通過第一函數(shù)基于第一id獲取到多個(gè)線程控制塊的地址;基于第一線程id從多個(gè)線程控制塊的地址中獲取到第一線程控制塊的地址;通過第一函數(shù)基于第一線程控制塊的地址和中第一偏移量獲取到第一線程變量的地址。之后,再通過第一函數(shù)將第一線程變量的地址傳遞至第一線程。
18、這樣,對于第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,均通過第一函數(shù)獲取到第一線程變量的地址。
19、結(jié)合第一方面,在一種可能的實(shí)現(xiàn)方式中,第一線程控制塊中存儲(chǔ)有第一動(dòng)態(tài)庫中第一線程變量所在的段的內(nèi)容,第一線程控制塊用于存儲(chǔ)第一線程調(diào)用第一線程變量的數(shù)據(jù),第一id為第一動(dòng)態(tài)庫的動(dòng)態(tài)庫id;通過第一函數(shù)獲取到第一線程變量的地址,具體包括:通過第一函數(shù)基于第一id獲取到多個(gè)線程控制塊的地址;通過第一函數(shù)基于第一線程id從多個(gè)線程控制塊的地址中獲取到第一線程控制塊的地址;通過第一函數(shù)基于第一線程控制塊的地址和中第一偏移量獲取到第一線程變量的地址;通過第一函數(shù)將第一線程變量的地址傳遞至第一線程。
20、這樣,需要區(qū)分第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,在第一線程變量是第一動(dòng)態(tài)庫中的線程變量的情況下,通過第一函數(shù)獲取到第一線程變量的地址。
21、結(jié)合第一方面,在一種可能的實(shí)現(xiàn)方式中,第一線程控制塊中存儲(chǔ)有第一進(jìn)程中第一線程變量所在的段的內(nèi)容,第一線程控制塊用于存儲(chǔ)第一線程調(diào)用第一線程變量的數(shù)據(jù),第一id為第一進(jìn)程的進(jìn)程id;
22、運(yùn)行所述更新補(bǔ)丁文件并執(zhí)行所述更新補(bǔ)丁文件中的所述第一指令,獲取到所述第一線程變量的地址,具體包括:運(yùn)行所述更新補(bǔ)丁文件并執(zhí)行所述更新補(bǔ)丁文件中的所述第一指令;響應(yīng)于所述第一指令,通過所述第一進(jìn)程獲取到所述第一進(jìn)程的首地址;通過所述第一進(jìn)程基于所述第一進(jìn)程的首地址、第二偏移量和第三偏移量確定出多個(gè)線程控制塊的地址,所述第二偏移量為所述第一進(jìn)程中定義的所述第一線程變量距離所述第一進(jìn)程中所述第一指令之間的偏移量,所述第三偏移量為預(yù)設(shè)值;通過所述第一進(jìn)程基于第一線程id從所述多個(gè)線程控制塊的地址中獲取到所述第一線程控制塊的地址;通過所述第一進(jìn)程基于所述第一線程控制塊的地址和所述第一偏移量獲取到所述第一線程變量的地址;通過所述第一進(jìn)程將所述第一線程變量的地址傳遞至所述第一線程。
23、其中,第三偏移量可以是一個(gè)線程控制塊的大小。
24、這樣,在第一線程變量是第一動(dòng)態(tài)庫中的線程變量的情況下,可以直接通過第一進(jìn)程獲取到第一線程變量的地址。
25、第二方面,本技術(shù)提供了一種補(bǔ)丁執(zhí)行裝置,裝置包括獲取模塊、執(zhí)行模塊和調(diào)用模塊;其中,獲取模塊,用于獲取到補(bǔ)丁文件,補(bǔ)丁文件用于修復(fù)第一進(jìn)程中存在的缺陷,補(bǔ)丁文件中引用有第一線程變量,第一線程變量為第一進(jìn)程或者第一動(dòng)態(tài)庫中定義的線程變量。
26、執(zhí)行模塊,用于:
27、在補(bǔ)丁文件中新增got表,got表包括第一表項(xiàng)和第二表項(xiàng),第一表項(xiàng)為第一線程變量的偏移量,第二表項(xiàng)為第一線程變量所在模塊的模塊id。
28、獲取到第一線程變量的偏移量為第一偏移量和第一線程變量所在模塊的模塊id為第一id。
29、將第一偏移量和第一id更新至got表中,得到更新補(bǔ)丁文件。
30、運(yùn)行更新補(bǔ)丁文件,通過第一函數(shù)獲取到第一線程變量的地址,第一函數(shù)是通過got表中第一偏移量和第一id獲取到第一線程變量的地址的。
31、調(diào)用模塊,用于通過第一線程變量的地址調(diào)用第一線程變量。
32、通過該方法,實(shí)現(xiàn)了補(bǔ)丁文件即可以調(diào)用進(jìn)程中的線程變量,又可以調(diào)用動(dòng)態(tài)庫中的線程變量。
33、結(jié)合第二方面,在一種可能的實(shí)現(xiàn)方式中,執(zhí)行模塊,還用于:
34、獲取到補(bǔ)丁文件中引用第一線程變量的第一指令。
35、在第一指令為非通過函數(shù)獲取第一線程變量的地址的情況下,將第一指令修改為第二指令,第二指令為通過第一函數(shù)獲取到第一線程變量的地址。
36、執(zhí)行模塊,具體用于運(yùn)行更新補(bǔ)丁文件并執(zhí)行更新補(bǔ)丁文件中的第二指令,通過第一函數(shù)獲取到第一線程變量的地址。
37、這樣,在第一線程變量為第一進(jìn)程和/或第一動(dòng)態(tài)庫中的線程變量的情況下,若第一指令不是通過函數(shù)獲取第一線程變量的地址,將第一指令修改為第二指令,第二指令是通過系統(tǒng)函數(shù)獲取到第一線程變量的地址的,保證補(bǔ)丁文件可以正常調(diào)用第一進(jìn)程中的第一線程變量,也可以調(diào)用第一動(dòng)態(tài)庫中的第一線程變量。
38、結(jié)合第二方面,在一種可能的實(shí)現(xiàn)方式中,執(zhí)行模塊,具體用于在第一指令為非通過函數(shù)獲取第一線程變量的地址且第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,將第一指令修改為第二指令。
39、這樣,僅在第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,將第一指令修改為第二指令,保證補(bǔ)丁文件可以正常調(diào)用第一動(dòng)態(tài)庫中的第一線程變量。
40、結(jié)合第二方面,在一種可能的實(shí)現(xiàn)方式中,執(zhí)行模塊,還用于在第一線程變量為第一進(jìn)程中定義的線程變量的情況下,運(yùn)行更新補(bǔ)丁文件并執(zhí)行更新補(bǔ)丁文件中的第一指令,獲取到第一線程變量的地址。
41、第一指令為通過第一進(jìn)程獲取到第一線程變量的地址。這樣,在第一線程變量為第一進(jìn)程中定義的線程變量的情況下,第一進(jìn)程可以直接獲取到第一線程變量的地址,從而無需將第一指令修改為第二指令。
42、結(jié)合第二方面,在一種可能的實(shí)現(xiàn)方式中,執(zhí)行模塊,具體用于:
43、在加載補(bǔ)丁文件之前,獲取到第一線程變量的偏移量為第一偏移量,將第一線程變量所在模塊的模塊id置為第二值,將第一偏移量和第二值更新至got表中。
44、在加載補(bǔ)丁文件之后,獲取到第一線程變量所在模塊的模塊id為第一值,將got表中第一線程變量所在模塊的模塊id由第二值修改為第一值,得到更新補(bǔ)丁文件。
45、這樣,不區(qū)分第一線程變量為進(jìn)程中的線程變量還是動(dòng)態(tài)庫中的線程變量,均在加載補(bǔ)丁文件之后,再獲取到第一線程變量所在模塊的模塊id。
46、結(jié)合第二方面,在一種可能的實(shí)現(xiàn)方式中,執(zhí)行模塊,具體用于:
47、在加載補(bǔ)丁文件之前,在第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,獲取到第一線程變量的偏移量為第一偏移量,將第一線程變量所在模塊的模塊id置為第二值,將第一偏移量和第二值更新至got表中。
48、在加載補(bǔ)丁文件之后,在第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,獲取到第一線程變量所在模塊的模塊id為第一值,將got表中第一線程變量所在模塊的模塊id由第二值修改為第一值,得到更新補(bǔ)丁文件。
49、這樣,需要區(qū)分第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,在第一線程變量為第一動(dòng)態(tài)庫中的線程變量的情況下,在加載補(bǔ)丁文件之后,再獲取到第一線程變量所在第一動(dòng)態(tài)庫的動(dòng)態(tài)庫id。
50、結(jié)合第二方面,在一種可能的實(shí)現(xiàn)方式中,執(zhí)行模塊,還用于在加載補(bǔ)丁文件之前,在第一線程變量為第一進(jìn)程中定義的線程變量的情況下,獲取到第一線程變量的偏移量為第一偏移量和第一線程變量所在模塊的模塊id為第一id,并將第一偏移量和第一id更新至got表中,得到更新補(bǔ)丁文件。
51、這樣,需要區(qū)分第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,在第一線程變量為第一進(jìn)程中的線程變量的情況下,在加載補(bǔ)丁文件之前,就可以獲取到第一線程變量所在第一進(jìn)程的進(jìn)程id。
52、結(jié)合第二方面,在一種可能的實(shí)現(xiàn)方式中,第一線程控制塊中存儲(chǔ)有第一動(dòng)態(tài)庫中或者第一進(jìn)程中包括第一線程變量所在的段的內(nèi)容,第一線程控制塊用于存儲(chǔ)第一線程調(diào)用第一線程變量的數(shù)據(jù),第一id為第一動(dòng)態(tài)庫的動(dòng)態(tài)庫id或者第一進(jìn)程的進(jìn)程id。
53、獲取模塊,具體用于:
54、通過第一函數(shù)基于第一id獲取到多個(gè)線程控制塊的地址。
55、基于第一線程id從多個(gè)線程控制塊的地址中獲取到第一線程控制塊的地址。
56、通過第一函數(shù)基于第一線程控制塊的地址和中第一偏移量獲取到第一線程變量的地址。之后,再通過第一函數(shù)將第一線程變量的地址傳遞至第一線程。
57、這樣,對于第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,均通過第一函數(shù)獲取到第一線程變量的地址。
58、結(jié)合第二方面,在一種可能的實(shí)現(xiàn)方式中,第一線程控制塊中存儲(chǔ)有第一動(dòng)態(tài)庫中第一線程變量所在的段的內(nèi)容,第一線程控制塊用于存儲(chǔ)第一線程調(diào)用第一線程變量的數(shù)據(jù),第一id為第一動(dòng)態(tài)庫的動(dòng)態(tài)庫id。
59、獲取模塊,具體用于:
60、通過第一函數(shù)基于第一id獲取到多個(gè)線程控制塊的地址。
61、通過第一函數(shù)基于第一線程id從多個(gè)線程控制塊的地址中獲取到第一線程控制塊的地址。
62、通過第一函數(shù)基于第一線程控制塊的地址和中第一偏移量獲取到第一線程變量的地址。通過第一函數(shù)將第一線程變量的地址傳遞至第一線程。
63、這樣,需要區(qū)分第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,在第一線程變量是第一動(dòng)態(tài)庫中的線程變量的情況下,通過第一函數(shù)獲取到第一線程變量的地址。
64、結(jié)合第二方面,在一種可能的實(shí)現(xiàn)方式中,第一線程控制塊中存儲(chǔ)有第一進(jìn)程中第一線程變量所在的段的內(nèi)容,第一線程控制塊用于存儲(chǔ)第一線程調(diào)用第一線程變量的數(shù)據(jù),第一id為第一進(jìn)程的進(jìn)程id。
65、獲取模塊,具體用于:
66、運(yùn)行所述更新補(bǔ)丁文件并執(zhí)行所述更新補(bǔ)丁文件中的所述第一指令。
67、響應(yīng)于所述第一指令,通過所述第一進(jìn)程獲取到所述第一進(jìn)程的首地址。
68、通過所述第一進(jìn)程基于所述第一進(jìn)程的首地址、第二偏移量和第三偏移量確定出多個(gè)線程控制塊的地址,所述第二偏移量為所述第一進(jìn)程中定義的所述第一線程變量距離所述第一進(jìn)程中所述第一指令之間的偏移量,所述第三偏移量為預(yù)設(shè)值。
69、通過所述第一進(jìn)程基于第一線程id從所述多個(gè)線程控制塊的地址中獲取到所述第一線程控制塊的地址。
70、通過所述第一進(jìn)程基于所述第一線程控制塊的地址和所述第一偏移量獲取到所述第一線程變量的地址。
71、通過所述第一進(jìn)程將所述第一線程變量的地址傳遞至所述第一線程。
72、其中,第三偏移量可以是一個(gè)線程控制塊的大小。
73、這樣,在第一線程變量是第一動(dòng)態(tài)庫中的線程變量的情況下,可以直接通過第一進(jìn)程獲取到第一線程變量的地址。
74、第三方面,本技術(shù)提供了另一種補(bǔ)丁執(zhí)行裝置,該裝置包括存儲(chǔ)器與處理器。存儲(chǔ)器用于存儲(chǔ)計(jì)算機(jī)程序代碼,計(jì)算機(jī)程序代碼包括計(jì)算機(jī)指令,處理器調(diào)用計(jì)算機(jī)指令以使得補(bǔ)丁執(zhí)行裝置執(zhí)行:
75、獲取到補(bǔ)丁文件,補(bǔ)丁文件用于修復(fù)第一進(jìn)程中存在的缺陷,補(bǔ)丁文件中引用有第一線程變量,第一線程變量為第一進(jìn)程或者第一動(dòng)態(tài)庫中定義的線程變量。
76、在補(bǔ)丁文件中新增got表,got表包括第一表項(xiàng)和第二表項(xiàng),第一表項(xiàng)為第一線程變量的偏移量,第二表項(xiàng)為第一線程變量所在模塊的模塊id。
77、獲取到第一線程變量的偏移量為第一偏移量和第一線程變量所在模塊的模塊id為第一id;將第一偏移量和第一id更新至got表中,得到更新補(bǔ)丁文件。
78、運(yùn)行更新補(bǔ)丁文件,通過第一函數(shù)獲取到第一線程變量的地址,第一函數(shù)是通過got表中第一偏移量和第一id獲取到第一線程變量的地址的。
79、通過第一線程變量的地址調(diào)用第一線程變量。
80、實(shí)現(xiàn)了補(bǔ)丁文件即可以調(diào)用進(jìn)程中的線程變量,又可以調(diào)用動(dòng)態(tài)庫中的線程變量。
81、結(jié)合第三方面,在一種可能的實(shí)現(xiàn)方式中,處理器調(diào)用計(jì)算機(jī)指令以使得補(bǔ)丁執(zhí)行裝置執(zhí)行:
82、獲取到補(bǔ)丁文件中引用第一線程變量的第一指令。
83、在第一指令為非通過函數(shù)獲取第一線程變量的地址的情況下,將第一指令修改為第二指令,第二指令為通過第一函數(shù)獲取到第一線程變量的地址。
84、運(yùn)行更新補(bǔ)丁文件并執(zhí)行更新補(bǔ)丁文件中的第二指令,通過第一函數(shù)獲取到第一線程變量的地址。
85、這樣,在第一線程變量為第一進(jìn)程和/或第一動(dòng)態(tài)庫中的線程變量的情況下,若第一指令不是通過函數(shù)獲取第一線程變量的地址,將第一指令修改為第二指令,第二指令是通過系統(tǒng)函數(shù)獲取到第一線程變量的地址的,保證補(bǔ)丁文件可以正常調(diào)用第一進(jìn)程中的第一線程變量,也可以調(diào)用第一動(dòng)態(tài)庫中的第一線程變量。
86、結(jié)合第三方面,在一種可能的實(shí)現(xiàn)方式中,處理器調(diào)用計(jì)算機(jī)指令以使得補(bǔ)丁執(zhí)行裝置執(zhí)行:
87、在第一指令為非通過函數(shù)獲取第一線程變量的地址且第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,將第一指令修改為第二指令。
88、這樣,僅在第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,將第一指令修改為第二指令,保證補(bǔ)丁文件可以正常調(diào)用第一動(dòng)態(tài)庫中的第一線程變量。
89、結(jié)合第三方面,在一種可能的實(shí)現(xiàn)方式中,處理器調(diào)用計(jì)算機(jī)指令以使得補(bǔ)丁執(zhí)行裝置執(zhí)行:
90、在第一線程變量為第一進(jìn)程中定義的線程變量的情況下,運(yùn)行更新補(bǔ)丁文件并執(zhí)行更新補(bǔ)丁文件中的第一指令,獲取到第一線程變量的地址。
91、第一指令為通過第一進(jìn)程獲取到第一線程變量的地址。這樣,在第一線程變量為第一進(jìn)程中定義的線程變量的情況下,第一進(jìn)程可以直接獲取到第一線程變量的地址,從而無需將第一指令修改為第二指令。
92、結(jié)合第三方面,在一種可能的實(shí)現(xiàn)方式中,處理器調(diào)用計(jì)算機(jī)指令以使得補(bǔ)丁執(zhí)行裝置執(zhí)行:
93、在加載補(bǔ)丁文件之前,獲取到第一線程變量的偏移量為第一偏移量,將第一線程變量所在模塊的模塊id置為第二值,將第一偏移量和第二值更新至got表中。
94、在加載補(bǔ)丁文件之后,獲取到第一線程變量所在模塊的模塊id為第一值,將got表中第一線程變量所在模塊的模塊id由第二值修改為第一值,得到更新補(bǔ)丁文件。
95、這樣,不區(qū)分第一線程變量為進(jìn)程中的線程變量還是動(dòng)態(tài)庫中的線程變量,均在加載補(bǔ)丁文件之后,再獲取到第一線程變量所在模塊的模塊id。
96、結(jié)合第三方面,在一種可能的實(shí)現(xiàn)方式中,處理器調(diào)用計(jì)算機(jī)指令以使得補(bǔ)丁執(zhí)行裝置執(zhí)行:
97、在加載補(bǔ)丁文件之前,在第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,獲取到第一線程變量的偏移量為第一偏移量,將第一線程變量所在模塊的模塊id置為第二值,將第一偏移量和第二值更新至got表中。
98、在加載補(bǔ)丁文件之后,在第一線程變量為第一動(dòng)態(tài)庫中定義的線程變量的情況下,獲取到第一線程變量所在模塊的模塊id為第一值,將got表中第一線程變量所在模塊的模塊id由第二值修改為第一值,得到更新補(bǔ)丁文件。
99、這樣,需要區(qū)分第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,在第一線程變量為第一動(dòng)態(tài)庫中的線程變量的情況下,在加載補(bǔ)丁文件之后,再獲取到第一線程變量所在第一動(dòng)態(tài)庫的動(dòng)態(tài)庫id。
100、結(jié)合第三方面,在一種可能的實(shí)現(xiàn)方式中,處理器調(diào)用計(jì)算機(jī)指令以使得補(bǔ)丁執(zhí)行裝置執(zhí)行:在加載補(bǔ)丁文件之前,在第一線程變量為第一進(jìn)程中定義的線程變量的情況下,獲取到第一線程變量的偏移量為第一偏移量和第一線程變量所在模塊的模塊id為第一id,并將第一偏移量和第一id更新至got表中,得到更新補(bǔ)丁文件。
101、這樣,需要區(qū)分第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,在第一線程變量為第一進(jìn)程中的線程變量的情況下,在加載補(bǔ)丁文件之前,就可以獲取到第一線程變量所在第一進(jìn)程的進(jìn)程id。
102、結(jié)合第三方面,在一種可能的實(shí)現(xiàn)方式中,第一線程控制塊中存儲(chǔ)有第一動(dòng)態(tài)庫中或者第一進(jìn)程中包括第一線程變量所在的段的內(nèi)容,第一線程控制塊用于存儲(chǔ)第一線程調(diào)用第一線程變量的數(shù)據(jù),第一id為第一動(dòng)態(tài)庫的動(dòng)態(tài)庫id或者第一進(jìn)程的進(jìn)程id。
103、處理器調(diào)用計(jì)算機(jī)指令以使得補(bǔ)丁執(zhí)行裝置執(zhí)行:
104、通過第一函數(shù)基于第一id獲取到多個(gè)線程控制塊的地址。
105、基于第一線程id從多個(gè)線程控制塊的地址中獲取到第一線程控制塊的地址。
106、通過第一函數(shù)基于第一線程控制塊的地址和中第一偏移量獲取到第一線程變量的地址。之后,再通過第一函數(shù)將第一線程變量的地址傳遞至第一線程。
107、這樣,對于第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,均通過第一函數(shù)獲取到第一線程變量的地址。
108、結(jié)合第三方面,在一種可能的實(shí)現(xiàn)方式中,第一線程控制塊中存儲(chǔ)有第一動(dòng)態(tài)庫中第一線程變量所在的段的內(nèi)容,第一線程控制塊用于存儲(chǔ)第一線程調(diào)用第一線程變量的數(shù)據(jù),第一id為第一動(dòng)態(tài)庫的動(dòng)態(tài)庫id。
109、處理器調(diào)用計(jì)算機(jī)指令以使得補(bǔ)丁執(zhí)行裝置執(zhí)行:
110、通過第一函數(shù)基于第一id獲取到多個(gè)線程控制塊的地址。
111、通過第一函數(shù)基于第一線程id從多個(gè)線程控制塊的地址中獲取到第一線程控制塊的地址。
112、通過第一函數(shù)基于第一線程控制塊的地址和中第一偏移量獲取到第一線程變量的地址。通過第一函數(shù)將第一線程變量的地址傳遞至第一線程。
113、這樣,需要區(qū)分第一線程變量是第一進(jìn)程中的線程變量還是第一動(dòng)態(tài)庫中的線程變量,在第一線程變量是第一動(dòng)態(tài)庫中的線程變量的情況下,通過第一函數(shù)獲取到第一線程變量的地址。
114、結(jié)合第三方面,在一種可能的實(shí)現(xiàn)方式中,第一線程控制塊中存儲(chǔ)有第一進(jìn)程中第一線程變量所在的段的內(nèi)容,第一線程控制塊用于存儲(chǔ)第一線程調(diào)用第一線程變量的數(shù)據(jù),第一id為第一進(jìn)程的進(jìn)程id。
115、處理器調(diào)用計(jì)算機(jī)指令以使得補(bǔ)丁執(zhí)行裝置執(zhí)行:
116、運(yùn)行所述更新補(bǔ)丁文件并執(zhí)行所述更新補(bǔ)丁文件中的所述第一指令。
117、響應(yīng)于所述第一指令,通過所述第一進(jìn)程獲取到所述第一進(jìn)程的首地址。
118、通過所述第一進(jìn)程基于所述第一進(jìn)程的首地址、第二偏移量和第三偏移量確定出多個(gè)線程控制塊的地址,所述第二偏移量為所述第一進(jìn)程中定義的所述第一線程變量距離所述第一進(jìn)程中所述第一指令之間的偏移量,所述第三偏移量為預(yù)設(shè)值。
119、通過所述第一進(jìn)程基于第一線程id從所述多個(gè)線程控制塊的地址中獲取到所述第一線程控制塊的地址。
120、通過所述第一進(jìn)程基于所述第一線程控制塊的地址和所述第一偏移量獲取到所述第一線程變量的地址。
121、通過所述第一進(jìn)程將所述第一線程變量的地址傳遞至所述第一線程。
122、其中,第三偏移量可以是一個(gè)線程控制塊的大小。
123、這樣,在第一線程變量是第一動(dòng)態(tài)庫中的線程變量的情況下,可以直接通過第一進(jìn)程獲取到第一線程變量的地址。
124、第四方面,本技術(shù)提供了一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),用于存儲(chǔ)計(jì)算機(jī)指令,當(dāng)計(jì)算機(jī)指令在補(bǔ)丁執(zhí)行裝置上運(yùn)行時(shí),使得補(bǔ)丁執(zhí)行裝置執(zhí)行上述第一方面任一可能的實(shí)現(xiàn)方式中提供的一種補(bǔ)丁執(zhí)行方法。
125、第五方面,本技術(shù)提供了一種計(jì)算機(jī)程序產(chǎn)品,當(dāng)計(jì)算機(jī)程序產(chǎn)品在補(bǔ)丁執(zhí)行裝置上運(yùn)行時(shí),使得補(bǔ)丁執(zhí)行裝置執(zhí)行上述第一方面任一可能的實(shí)現(xiàn)方式中提供的一種補(bǔ)丁執(zhí)行方法。
126、對于第二方面至第五方面的有益效果,可以參考第一方面中有益效果的描述,本技術(shù)在此不做贅述。