假的main函数,C/C++编译器被我骗了!

Поділитися
Вставка
  • Опубліковано 31 гру 2024

КОМЕНТАРІ • 46

  • @palapapa0201
    @palapapa0201 4 місяці тому +25

    在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.

    • @junsongli1815
      @junsongli1815 4 місяці тому

      你错了, c++ 诞生的时候就规定 main 不能当数组. 所以 这个只能用 C 编译.

    • @palapapa0201
      @palapapa0201 4 місяці тому +1

      @@junsongli1815 標準裡面沒有明講,不能用跟 undefined behavior 不一樣,前者要 diagnostic,後者不用

    • @yung-hsiang
      @yung-hsiang 4 місяці тому

      @@junsongli1815 影片是用 g++ 0:14

  • @Yueyelongbob
    @Yueyelongbob 3 місяці тому +1

    最近刚学C,其实这是新手必学知识,要点是function本质上是一串可执行的字节序列,情况跟array相似。arr[n]本质上是*(arr+n),对应的func()本质上就是pointer()。
    学变量声明时基本都应该学到,不知道这个甚至都无法正常写代码。

  • @jhddhjivuurhhf
    @jhddhjivuurhhf 4 місяці тому +25

    睡前看這個最適合了

    • @xuanyuancoding
      @xuanyuancoding  4 місяці тому +4

      很助眠吗

    • @田自強
      @田自強 4 місяці тому

      @@xuanyuancoding 很助眠,至少比之前(可怕!CPU暗藏了这些未公开的指令!)有料多了.
      至少這篇跟TCP三次握手居然只握两次也可以?可以了.

  • @i_thoing
    @i_thoing 4 місяці тому +7

    這類動畫是如何做出來的 很適合教學用

  • @tommymairo8964
    @tommymairo8964 4 місяці тому +3

    其實沒必要 no-pic 或者關 ASLR,你都拿到 EIP 了,再算一下 relocated section base 就行。如果關 ASLR,一開始就沒必要拿 EIP,因為都是死數字,直接硬編碼就行。

  • @tommymairo8964
    @tommymairo8964 4 місяці тому +2

    4:40 PLT 的 offset 是固定的,所以沒必要 indirect call,拿到 relocated address 後直接加上偏移量 call 就行

    • @tommymairo8964
      @tommymairo8964 4 місяці тому +2

      5:00 淦!壓根沒開 ASLR 😂 那壓根就不用拿 EIP 的值,能直接算出來 😅

  • @yiranmushroom
    @yiranmushroom 4 місяці тому +8

    C有可能,C++行吗?

    • @田自強
      @田自強 4 місяці тому +1

      以前版本C++(直到微軟完全放棄C編碼版本為止前)是可以.

  • @banxian
    @banxian 4 місяці тому +1

    应该说是链接器把crt启动代码所请求的main其中之一的无修饰扩展符号_main和数组匹配到了一起.

    • @palapapa0201
      @palapapa0201 4 місяці тому

      _main是幹嘛的?我找不到太多關於它的資訊

  • @user-goldenfishman
    @user-goldenfishman 4 місяці тому +4

    現在我知道為什麼我計算機概論不會過了😭
    我連一個YT影片都看不懂

    • @PenguinYan
      @PenguinYan 4 місяці тому +7

      我覺得這東西有點超出「計算機概論」的範疇了,在我的映像中(高中、大學)計概很少講到機械碼,就算講道也只是稍微帶過,直到「系統程式」的課程才有教到組譯、控制段、連結.....等等
      不過這東西除非深入研究,不然應該很少人會去拆機械碼來優化吧

    • @老馬夜
      @老馬夜 4 місяці тому +2

      @@PenguinYan 那叫組合語言,現在大學很少在教了,所以現在也很少人看得懂機械碼這種低階語言了。

    • @PenguinYan
      @PenguinYan 4 місяці тому

      @@老馬夜 組合語言跟機械碼差不多啦~沒辦法現在編譯器都會幫你算到好,對於學生來說如果沒有摸到這麼硬的話,學這個也就只是多一個無用知識,學校也懶得去教這些,畢竟如果為這個當太多人學生會靠腰,不如就簡單帶過
      我前幾年在學這個的時候全班60人能算出來的也就不到一半,而且還不是x86價構是另一個忘記名字的簡單架構

    • @無名氏-l1c
      @無名氏-l1c 4 місяці тому

      @@PenguinYan偶爾遇到奇怪的行為還是回去看一下asml吧。畢竟compiler魔法越來越多

    • @junsongli1815
      @junsongli1815 4 місяці тому

      我只记住了几个简单常用了指令 如 条件判断 跳转 循环 , 不过这里获取当前指令地址的方式很巧妙.

  • @richardhsiao7060
    @richardhsiao7060 4 місяці тому +2

    我自己試了一下,編譯不出來啊
    報錯說main不能當作全域變數

    • @kunkun06
      @kunkun06 4 місяці тому +4

      我在 xubuntu 24.04 下找方法裝個 g++ 4.8 然後編譯指令打:
      g++-4.8 -fpermissive -Wnarrowing -z execstack
      可以編譯完成
      覺得這影片還是在搞事情,沒有講清楚 g++ 要多少版本以下,連提一下 g++ 的版本比較新的情況下會無法編譯都沒有

    • @palapapa0201
      @palapapa0201 4 місяці тому +2

      C++之後才有明確規定 global variable 不能叫 main,在這之前以及在C都是 undefined behavior

    • @junsongli1815
      @junsongli1815 4 місяці тому +1

      你这个编译器太新了. 编译时加参数 -std=c++99 使用C99版本编译. 新编译器默认是 -std=c++17 不支持数组当main函数的.

    • @richardhsiao7060
      @richardhsiao7060 4 місяці тому +1

      @@junsongli1815 多謝,換個compiler就行了

    • @kunkun06
      @kunkun06 4 місяці тому

      ​@@junsongli1815 哪來的 c++99 只有 c++98 我這邊 g++ 即便打 -std=c++98 還是不能編譯,我不知道你有沒有實際試過,但確定的是我有試過

  • @Gilbert-qi5fo
    @Gilbert-qi5fo 4 місяці тому

    我現在才看主播到有ctf 好可惜 好想參加呀

    • @xuanyuancoding
      @xuanyuancoding  4 місяці тому

      CTF已经结束了,不过可以来做做之前的题目哈:mp.weixin.qq.com/s/Ys82LaJVscDSXSJCdKs7EQ

  • @kigg7788
    @kigg7788 4 місяці тому

    我看了天書

  • @mingzih
    @mingzih 4 місяці тому

    hello.

  • @xiongliu325
    @xiongliu325 4 місяці тому

    讨厌谜语人