在C++17及以後才有規定 main 不能當 global variable 的名字,在這以前以及在C都算是 undefined behavior。 A program that declares a variable main that belongs to the global scope, or a function main that belongs to the global scope and is attached to a named module, or a function template main that belongs to the global scope, or an entity named main with C language linkage (in any namespace) is ill-formed. The name main is not otherwise reserved.
在C++17及以後才有規定 main 不能當 global variable 的名字,在這以前以及在C都算是 undefined behavior。
A program that declares
a variable main that belongs to the global scope, or
a function main that belongs to the global scope and is attached to a named module, or
a function template main that belongs to the global scope, or
an entity named main with C language linkage (in any namespace)
is ill-formed.
The name main is not otherwise reserved.
你错了, c++ 诞生的时候就规定 main 不能当数组. 所以 这个只能用 C 编译.
@@junsongli1815 標準裡面沒有明講,不能用跟 undefined behavior 不一樣,前者要 diagnostic,後者不用
@@junsongli1815 影片是用 g++ 0:14
最近刚学C,其实这是新手必学知识,要点是function本质上是一串可执行的字节序列,情况跟array相似。arr[n]本质上是*(arr+n),对应的func()本质上就是pointer()。
学变量声明时基本都应该学到,不知道这个甚至都无法正常写代码。
睡前看這個最適合了
很助眠吗
@@xuanyuancoding 很助眠,至少比之前(可怕!CPU暗藏了这些未公开的指令!)有料多了.
至少這篇跟TCP三次握手居然只握两次也可以?可以了.
這類動畫是如何做出來的 很適合教學用
keynote哦
其實沒必要 no-pic 或者關 ASLR,你都拿到 EIP 了,再算一下 relocated section base 就行。如果關 ASLR,一開始就沒必要拿 EIP,因為都是死數字,直接硬編碼就行。
正确的
4:40 PLT 的 offset 是固定的,所以沒必要 indirect call,拿到 relocated address 後直接加上偏移量 call 就行
5:00 淦!壓根沒開 ASLR 😂 那壓根就不用拿 EIP 的值,能直接算出來 😅
C有可能,C++行吗?
以前版本C++(直到微軟完全放棄C編碼版本為止前)是可以.
应该说是链接器把crt启动代码所请求的main其中之一的无修饰扩展符号_main和数组匹配到了一起.
_main是幹嘛的?我找不到太多關於它的資訊
現在我知道為什麼我計算機概論不會過了😭
我連一個YT影片都看不懂
我覺得這東西有點超出「計算機概論」的範疇了,在我的映像中(高中、大學)計概很少講到機械碼,就算講道也只是稍微帶過,直到「系統程式」的課程才有教到組譯、控制段、連結.....等等
不過這東西除非深入研究,不然應該很少人會去拆機械碼來優化吧
@@PenguinYan 那叫組合語言,現在大學很少在教了,所以現在也很少人看得懂機械碼這種低階語言了。
@@老馬夜 組合語言跟機械碼差不多啦~沒辦法現在編譯器都會幫你算到好,對於學生來說如果沒有摸到這麼硬的話,學這個也就只是多一個無用知識,學校也懶得去教這些,畢竟如果為這個當太多人學生會靠腰,不如就簡單帶過
我前幾年在學這個的時候全班60人能算出來的也就不到一半,而且還不是x86價構是另一個忘記名字的簡單架構
@@PenguinYan偶爾遇到奇怪的行為還是回去看一下asml吧。畢竟compiler魔法越來越多
我只记住了几个简单常用了指令 如 条件判断 跳转 循环 , 不过这里获取当前指令地址的方式很巧妙.
我自己試了一下,編譯不出來啊
報錯說main不能當作全域變數
我在 xubuntu 24.04 下找方法裝個 g++ 4.8 然後編譯指令打:
g++-4.8 -fpermissive -Wnarrowing -z execstack
可以編譯完成
覺得這影片還是在搞事情,沒有講清楚 g++ 要多少版本以下,連提一下 g++ 的版本比較新的情況下會無法編譯都沒有
C++之後才有明確規定 global variable 不能叫 main,在這之前以及在C都是 undefined behavior
你这个编译器太新了. 编译时加参数 -std=c++99 使用C99版本编译. 新编译器默认是 -std=c++17 不支持数组当main函数的.
@@junsongli1815 多謝,換個compiler就行了
@@junsongli1815 哪來的 c++99 只有 c++98 我這邊 g++ 即便打 -std=c++98 還是不能編譯,我不知道你有沒有實際試過,但確定的是我有試過
我現在才看主播到有ctf 好可惜 好想參加呀
CTF已经结束了,不过可以来做做之前的题目哈:mp.weixin.qq.com/s/Ys82LaJVscDSXSJCdKs7EQ
我看了天書
hello.
讨厌谜语人