主頁 >  其他 > 【讀書筆記】程式員的自我修養-鏈接、裝載與庫_第一章 編譯與鏈接

【讀書筆記】程式員的自我修養-鏈接、裝載與庫_第一章 編譯與鏈接

2021-09-06 17:09:23 其他

第一章 編譯與鏈接

一、被隱藏了的程序

1、在linux下,用gcc來編譯hello world程式時,假設源代碼檔案名為hello.c

$gcc hello.c
$./a.out
Hello World

上述程序可以分解為4個步驟:
預處理(Prepressing)、編譯(Compilation)、匯編(Assembly)和鏈接(Linking);
在這里插入圖片描述

補充:實際上 gcc 這個命令只是一些后臺程式的包裝,它會根據不同的引數要求去呼叫 預編譯編譯程式ccl、匯編器 as、聯結器 Id,

2.預編譯

對于hello.c 預編譯的時候,需要用到預編譯器 cpp
第一步預編譯的程序相當于如下命令(-E表示只進行預編譯):

$gcc -E hello.c -o hello.i
or
$cpp hello.c > hello.i

預編譯程序主要處理那些源代碼檔案中的以"#“開始的預編譯指令,比如”#include"、"#define"等,主要處理規則如下∶

● 將所有的"#define"洗掉,并且展開所有的宏定義,
●處理所有條件預編譯指令,比如"#if"、"#ifdef"、"#elif"、"#else"、"#endif",
●處理"#include"預編譯指令,將被包含的檔案插入到該預編譯指令的位置,注意,這個程序是遞回進行的,也就是說被包含的檔案可能還包含其他檔案,
● 洗掉所有的注釋"//“和”/* */",
●添加行號和檔案名標識,比如#2"hello.c"2,以便于編譯時編譯器產生除錯用的行號資訊及用于編譯時產生編譯錯誤或警告時能夠顯示行號,
●保留所有的#pragma 編譯器指令,因為編譯器須要使用它們,
經過預編譯后的.i檔案不包含任何宏定義,因為所有的宏已經被展開,并且包含的檔案也已經被插入到.i 檔案中,所以當我們無法判斷宏定義是否正確或頭檔案包含是否正確時,可以查看預編譯后的檔案來確定問題,

3.編譯

變異程序就是把預處理完成的檔案(hello.i)進行一系列詞法分析,語法分析,語意分析,優化后生成相應的匯編代碼檔案,

 $gcc -S hello.i -o hello.s
 or
 $gcc -S hello.c -o hello.s

現在版本的 GCC 把預編譯和編譯兩個步驟合并成一個步驟,使用一個叫做 ccl 的預編譯編譯程式來完成這兩個步驟,
這個程式位于"/usr/lib/gcc/i486-linux-gnu/4.1/",我們也可以直接呼叫 ccl 來完成它∶

$ /usr/lib/gcc/i486-linux-gnu/4.1/ccl hello.c

對于C 語言的代碼來說,這個預編譯和編譯的程式是 ccl;對于 C++來說,有對應的程式叫做cclplus;
Objective-C是cclobj;fortran 是 f771;java是 jcl,

所以實際上 gcc 這個命令只是這些后臺程式的包裝,它會根據不同的引數要求去呼叫 預編譯編譯程式ccl、匯編器 as、聯結器 Id,

4、匯編

匯編器是將匯編代碼轉變成機器可以執行的指令,每一個匯編陳述句幾乎都對應一潭訓器指令,匯編的程序只需要根據 匯編指令和機器指令對照表一一翻譯就可以了,匯編程序可以呼叫匯編器 as 來完成:

$as hello.s -o hello.o
or
$gcc -c hello.s -o hello.o 
or
$gcc -c hello.c -o hello.o

5、鏈接

用 ld 才可以產生一個能夠正常運行的 HelloWorld 程式∶

?$ld -static /usr/lib/crt1.o /ugr/lib/crti.o/uar/lib/gcc/i486-1linux-gnu/4.1.3/crtbeginr.o?-
?L/ugr/lib/gcc/i486-1inux-gnu/4.1.3 -L/ugr/lib-L/1ib hello.o--start-group-1gcc -1gcc_eh -
?1c --end-group /usr/lib/gcc/1486-1inux-gnu/4.1.3/crtend.o/ugr/lib/crtn.o

如果把所有的路徑都省略掉,那么上面的命令就是∶

ld -static crt1.o crti.o crtbeginT.o hello.o-start-group -lgcc-lgcc_eh -lc-end-group crtend.o 
crtn. o

二、編譯器擔任的角色

1、編譯器做了什么

編譯程序一般可分為6步:掃描(詞法分析)、語法分析、語意分析、源代碼優化、代碼生成、目標代碼優化,

從現在往下,我們以一個C語言源代碼為例:

array[index] = (index + 4) * (2 + 6);

2、詞法分析

將源代碼輸入到掃描器(Scanner),掃描器將源代碼的字符分割成一系列 記號(Token),
上面程式包含28個非空字符,產生16個記號,
在這里插入圖片描述

詞法分析產生的記號一般可以分為如下幾類∶關鍵字、識別符號、字面量(包含數字、字串等)和特殊符號(如加號、等號),
在識別記號的同時,掃描器也完成了其他作業:比如 將識別符號存放到符號表,將數字、字串常量存放到文字表等,以備后面的步驟使用,

有一個叫做 lex 的程式可以實作詞法掃描,它會按照用戶之前描述好的詞法規則將輸入的字串分割成一個個記號,
因為這樣一-個程式的存在,編譯器的開發者就無須為每個編譯器開發一個獨立的詞法掃描器,而是根據需要改變詞法規則就可以了,用戶設立不同的詞法規則,就可以將字串分割成不同的記號

另外對于一些有預處理的語言,比如 C 語言,它的宏替換和檔案包含等作業一般不歸入編譯器的范圍而交給一個獨立的前處理器

3、語法分析

語法分析是完成了對運算式語法層面的分析,不進行運算式是否有意義的判斷
語法分析器(Grammar Parser) 對 掃描器已經產生的記號 進行語法分析,采用了 背景關系無關語法(Context-free Grammar) 產生 語法樹(Syntax Tree).語法樹是以運算式為節點的樹,
上面例子經過語法分析器以后形成的語法樹如圖:
在這里插入圖片描述

正如前面詞法分析有 lex 一樣,語法分析也有一個現成的工具叫做 yacc(Yet Another Compiler Compiler)

yacc也像 lex 一樣,可以根據用戶給定的語法規則對輸入的記號序列進行決議,從而構建出一棵語法樹,

對于不同的編程語言,編譯器的開發者只須改變語法規則,而無須為每個編譯器撰寫一個語法分析器,所以它又被稱為"編譯器編譯器(Compiler Compiler)",

4、語意分析

語意分析器(Semantic Analyzer 來完成語意分析,判斷運算式是否有意義,編譯器所能分析的語意是 靜態語意(Static Semantic),靜態語意就是 在編譯期可以確定的語意;動態語意(Dynamic Semantic 就是只有在運行期才能確定的語意,

靜態語意 通常包括 宣告和型別的匹配,型別的轉換,

  • 比如當一個浮點型的運算式賦值給一-個整型的運算式時,其中隱含了一個浮點型到整型轉換的程序,語意分析程序中需要完成這個步驟;
  • 比如將一個浮點型賦值給一個指標的時候,語意分析程式會發現這個型別不匹配,編譯器將會報錯,

動態語意一般指在運行期出現的語意相關的問題.

  • 比如將 0作為除數是一個運行期語意錯誤,

經過語意分析階段以后,整個語法樹的運算式都被標識了型別,如果有些型別需要做隱式轉換,語意分析程式會在語法樹中插入相應的轉換節點,
在這里插入圖片描述

5、中間代碼生成

現代的編譯器有著很多層次的優化,在源代碼級別會有一個優化程序,
源代碼級優化器(Source Code Optimizer)會在源代碼級別進行優化,上面(2+6)這個運算式可以被優化掉,因為它的值在編譯期就可以被確定,
在這里插入圖片描述
我們看到(2 + 6)這個運算式被優化成8,直接在語法樹上作優化比較困難,所以源代碼優化器往往將整個語法樹轉換成 中間代碼(Intermediate Code),它是語法樹的順序表示,中間代碼已經非常接近目標代碼了,

中間代碼一般跟目標機器和運行時環境是無關的,比如它不包含資料的尺寸、變數地址和暫存器的名字等,

中間代碼有很多種型別,在不同的編譯器中有著不同的形式,比較常見的有:
三地址碼(Three-address Code)P-代碼(P-Code)

最基本的三地址碼是這樣的:x = y op z
這個三地址碼表示將變數 y 和 z 進行 op 操作以后,賦值給x,
這里 op 操作可以是算數運算,比如加減乘除等,也可以是其他任何可以應用到 y 和z的操作,

我們上面的例子中的語法樹可以被翻譯成三地址碼后是這樣的∶

 t1 = 26;
 t2 = index + 4;
 t3 = t2 * t1;
 array [index] = t3;

為了使所有的操作都符合三地址碼形式,這里利用了 t1 t2和 t3 臨時變數,

在三地址碼的基礎上進行優化時,優化程式會將 2+6 的結果計算出來,得到t1=8,然后將后面代碼中的t1 替換成數字 8,另外還可以省去一個臨時變數 t3,因為 t2 可以重復利用,經過優化以后的代碼如下∶

t2 = index + 4;
t2 = t2 * 8;
array[index] = t2;

中間代碼使得編譯器可以被分為前端后端

編譯器前端負責產生機器無關的中間代碼,編譯器后端將中間代碼轉換成目標機器代碼,

這樣對于一些可以跨平臺的編譯器而言,它們可以針對不同的平臺使用同一個前端和針對不同機器平臺的數個后端

6、目標代碼生成與優化

目標代碼生成與優化這整個程序都屬于編譯器后端,

編譯器后端主要包括代碼生成器(Code Generator)目標代碼優化器(Target Code Optimizer)

  • 代碼生成器中間代碼 轉換成 目標機器代碼,這個程序十分依賴于目標機器,因為不同的機器有著不同的字長、暫存器、整數資料型別和浮點數資料型別等,

對于上面例子中的中間代碼,代碼生成器可能會生成下面的代碼序列(x86 匯編語言)∶

movl index, %ecx            ; value of index to ecx 
addl $4,  %ecx              ; ecx = ecx + 4 
mull $8,  %ecx              ; ecx = ecx * 8
movl index, %eax            ; value of index to eax
movl %ecx,  array(,eax,4)   ; array[index] = ecx
  • 最后 目標代碼優化器對上述的目標代碼進行優化,比如選擇合適的尋址方式、使用位移來代替乘法運算、洗掉多余的指令等,

上面的例子中,乘法由一條相對復雜的基址比例變址尋址(Base Index Scale Addressina)lea指令完成,隨后由一條 mov 指令完成最后的賦值操作,這條 mov 指令的尋址方式與 lea 是一樣的,

movl      index, %edx
leal      32(, %edx, 8),   %eax
movl      %eax, array(, %edx, 4 )

程式定義其他模塊的全域變數和函式在最終運行時的絕對地址都要在最終鏈接的時候才能確定,

所以現代的編譯器可以將一個源代碼檔案編譯成一個未鏈接的目標檔案,然后由聯結器最終將這些目標檔案鏈接起來形成可執行檔案

三、聯結器年齡比編譯器長

1、原來的生活

在以前人們撰寫程式時,將所有源代碼都寫在同一個檔案中,發展到后來一個程式源代碼的檔案長達數百萬行,以至于人類已經沒有能力維護這個程式了,

原始的鏈接概念遠在高級程式語言發明之前就已經存在了,在最開始的時候,程式員先把一個程式在紙上寫好,當然 當時沒有很高級的語言,用的都是機器語言,甚至連匯編語言都沒有,當程式須要被運行時,程式員人工將他寫的程式寫入到存盤設備上,最原始的存盤設備之一就是紙帶,即在紙帶上打相應的孔,

我們假設有一種跳轉指令,它的高 4 位是 0001,表示這是一條跳轉指令; 低 4位存放的是跳轉目的地的絕對地址,
某個程式的第一條指令就是一條跳轉指令,它的目的地址是第 5 條指令(注意,第 5 條指令的絕對地址是 4),

程式并不是一寫好就水遠不變化的,它可能會經常被修改,
比如我們在第 1條指令之后、第5條指令之前插入了一潭訓多條指令,那么第 5條指令及后面的指令的位置將會相應地往后移動,原先第一條指令的低4 位的數字將需要相應地調整,在這個程序中,程式員需要人工重新計算每個子程式或跳轉的目標地址,當程式修改的時候,這些位置都要重新計算,十分繁瑣又耗時,并且很容易出錯,這種重新計算各個目標的地址程序被叫做重定位( Relocation)

如果我們有多條紙帶的程式,這些程式之間可能會有類似的跨紙帶之間的跳轉,這種程式經常修改 導致 跳轉目標地址變化 在程式擁有多個模塊的時候更為嚴重,

2、匯編語言與符號

匯編語言使用接近人類的各種符號和標記來幫助記憶,比如指令采用兩個或三個字母的縮寫,記住"jump"比記住 0001XXXX 是跳轉(jump)指令容易得多了;

匯編語言還可以使用符號來標記位置,比如一個符號"divide"表示一個除法子程式的起始地址,比記住 從某個位置開始的 第幾條指令 是除法子程式方便得多,
比如前而面紙帶程式中,我們把第5條指令開始的子程式命名為"foo",那么第一條指今的匯編就是; jmp foo

當然人們可以使用這種符號命名子程式或跳轉目標以后,不管這個 “foo” 之前插入或減少了多少條指令 導致"foo" 目標地址發生了什么變化,匯編器在每次匯編程式的時候會重新計算"foo"這個符號的地址,然后把所有參考到 “foo” 的指今 修正到這個正確的地址,

符號(Symbol)這個概念隨著匯編語言的普及迅速被使用,它用來表示一個地址,這個地址可能是一段子程式(后來發展成函式)的起始地址,也可以是一個變數的起始地址

3、代碼的模塊化&層次結構組織

后來人們開始將代碼按照功能或性質劃分,分別形成不同的功能模塊,不同的模塊之間按照層次結構或其他結構來組織,

這個在現代的軟體源代碼組織中很常見
在 C 語言中,最小的單位是變數和函式,若干個變數和函陣列成一個模塊,存放在一個",c"的源代碼檔案里,然后這些源代碼檔案按照目錄結構來組織,
在Java 中,每個類是一個基本的模塊,若干個類模塊組成一個包(Package),若干個包組合成一個程式,

現代的大型軟體往往擁有成千上萬個模塊,這些模塊之間相互依賴又相對獨立

  • 這種按照 層次化 及 模塊化 存盤 和 組織 源代碼 有很多好處,比如代碼更容易閱讀、理解、重用,每個模塊可以單獨開發、編譯、測驗,改變部分代碼不需要編譯整個程式等,

模塊之間如何組合的問題可以歸結為模塊之間如何通信的問題

最常見的屬于靜態語言的C/C++模塊之間通信有兩種方式,一種是模塊間的函式呼叫另外一種是模塊間的變數訪問

  • 函式訪向須知道目標函式的地址,變數訪問也須知道目標變數的地址,所以這兩種方式都可以歸結為一種方式,那就是模塊間符號的參考,

四、模塊拼裝——靜態鏈接

人們把每個源代碼模塊獨立地編譯,然后按照須要將它們"組裝"起來,這個組裝模塊的程序就是鏈接(Linking)

鏈接的主要內容就是:把各個模塊之間相互參考的部分都處理好,使得各個模塊之間能夠正確地銜接,

聯結器所要做的作業 其實跟前面所描述的"程式員人工調整地址"本質上沒什么兩樣,只不過現代的高級語言的諸多特性和功能,使得編譯器、聯結器更為復雜,功能更為強大,

從原理上來講,聯結器的作業是:把一些指令對其他符號地址的參考加以修正

在這里插入圖片描述

鏈接程序主要包括了地址和空間分配 (Address and Storage Allocation)、符號決議(Symbol Resolution)和重定位(Relocation) 等這些步驟,

符號決議有時候也被叫做符號系結(Symbol Binding )名稱系結(Name Binding )名稱決議(Name Resolution),甚至還有叫做地址系結(Address Binding )指令系結(Instruction Binding)的,大體上它們的意思都一樣,但從細節角度來區分,它們之間還是存在一定區別的,比如"決議"更傾向于靜態鏈接,而**“系結” 更傾向于動態鏈接**,即它們所使用的范圍不一樣,
在靜態鏈接,我們將統一稱為符號決議,

每個模塊的源代碼檔案 (如.c)檔案經過編譯器編譯成目標檔案(Object File,一般擴展名為.o 或.obj)目標檔案(模塊)庫(Library)一起鏈接形成最終可執行檔案

最常見的庫就是運行時庫(Runtime Library),它是支持程式運行的基本函式的集合,

庫其實是一組目標檔案的包,就是一些最常用的代碼編澤成目標檔案后打包存放,

五、小結

程式在經過 編譯: 掃描、語法分析、語意分析、源代碼優化、代碼生成和目標代碼優化 之后,源代碼終干被編譯成了目標代碼,但是這個目標代碼中有—個問題是∶ index 和 array 的地址還沒有確定

如果我們要把目標代碼使用匯編器編譯成真正能夠在機器上執行的指令,那么 index 和 array 的地址應該從哪兒得到呢?

假設index 和 array 和 fun() 定義在 a.c檔案中,在b.c檔案中使用;

  • 如果 index 和 array定義在跟上面的源代碼同一個編譯單元里面(定義和使用在同一個檔案里)
    那么編譯器可以為 index 和 array 分配空間,確定它們的地址;

在編譯之后,形成匯編代碼,就已經確定了array和index的地址

  • 如果index 和 array是定義在其他的程式模塊(沒有定義在一起,定義和使用不在同一個檔案)呢?

b.c 在編譯的時候并不知道 呼叫的 變數或函式 的地址,所以編譯器暫時 將 呼叫這些變數和函式 的指令 的目標地址 擱置,等待 所有的模塊(檔案)編譯匯編之后,聯結器將目標地址修正

使用聯結器,可以直接參考其他模塊的函式和全域變數而無須知道它們的地址,因為聯結器在鏈接的時候,會根據你所參考的符號 index&array&fun ,自動去相應的a.c 模塊查找 index&array&fun的地址,然后將 b.c 模塊中所有參考到index&array&fun的指令重新修正,讓它們的目標地址為真止的index&array&fun的地址,

這就是靜態鏈接的最基本的程序和作用,

目標代碼中有變數定義在其他模塊,該怎么辦?

事實上,定義在其他模塊的 全域變數和函式 在 最終運行時 的 絕對地址 都要 在 最終鏈接 的時候 才能確定,
所以現代的編譯器可以將一個源代碼檔案編譯成一個未鏈接的目標檔案,然后由聯結器最終將這些目標檔案鏈接起來形成可執行檔案,

在這一章中,我們首先回顧了從程式源代碼到最終可執行檔案的 4個步驟∶預編譯、編譯、匯編、鏈接,
分析了它們的作用及相互之間的聯系,IDE 集成開發工具 和 編譯器 默認的命令 通常將 這些步驟 合并成一步,使得我們通常很少關注這些步驟,

我們還詳細回顧了上面這 4 個步驟中的主要部分,即編譯步驟,介紹了編譯器 將 C 程式源代碼 轉變成 匯編代碼的若干個步驟∶詞法分析、語法分析、語意分析、中間代碼生成、目標代碼生成與優化,

最后我們介紹了鏈接的歷史和靜態鏈接的一系列基本概念∶ 重定位、符號、符號決議、目標檔案、庫、運行庫等概念,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297971.html

標籤:其他

上一篇:2021 年的一些體會:作業,家庭,投資,面試

下一篇:Java類加載的程序

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more