我有一個編譯的程序,我想知道它是否存在某一行。有沒有辦法,使用我的源代碼,我可以確定?逆向工程你自己的代碼C++
託尼評論我的消息,所以我會添加一些信息:
- 我用g ++編譯器。
- 我編譯在Linux(科學)的代碼/ Unix機器
- 我只能通過一些使用標準庫(沒有從網站下載)
- 所需的行是乘法(中的一個子功能而羣組)或在特定情況下打印行(如果聲明)
我需要這becouse我運行多個MD模擬,有時我發現我的自我在我不確定條件的情況下。
我有一個編譯的程序,我想知道它是否存在某一行。有沒有辦法,使用我的源代碼,我可以確定?逆向工程你自己的代碼C++
託尼評論我的消息,所以我會添加一些信息:
我需要這becouse我運行多個MD模擬,有時我發現我的自我在我不確定條件的情況下。
objdump是一個實用程序,可用作disassembler來查看程序集形式的可執行文件。
使用此命令拆解二進制,
objdump -Dslx file
需要注意的是,雖然反編譯器使用中存在的目標文件(ELF)的符號調試信息,那麼這些信息應該出現在你的目標文件。此外,源代碼中的常量&註釋不會是反彙編輸出的一部分。
摘要
使用源代碼控制和跟蹤哪些源代碼修改的可執行文件的自...建造它應該編寫成輸出,使你可以隨時交叉引用了兩下,檢出相同來源和重建給你的那些結果等可執行..
討論
所需的行是由數乘法(在一個小組的子功能)或在特定情況下打印一條線(如果聲明)
我需要這bec bec我運行多個MD模擬,有時我發現我的自我在一個情況下,我不是肯定的條件。
對於您希望所有的MD模擬中運行最新的源代碼,你可以比較上可執行的源文件時間戳來看看你忘了重新編譯非常簡單的情況下,比較過程開始時間(例如由ps列出)與可執行創建時間。
如果你故意部署多個版本的程序,只有最新的源代碼,那麼它會變得非常棘手。一個乘法通常只會產生一個機器代碼指令......除非你有一些上下文的見解,否則你不可能知道哪個乘法很重要(或者是否丟失)。編譯器可以產生它自己的乘法,例如,數組索引,有時可能會將乘法優化爲位移(或者沒有,如Ira評論),所以它不像說'好,它是我在函數「X」'中唯一的乘法那麼簡單。如果您正在打印可能更容易區分的特定行......如果有一個唯一的字符串文字,你可以在可執行文件中搜索它(例如puts("Hello")
- >strings program | grep Hello
,儘管它也可以得到其他的匹配,並且允許編譯器重用字符串文字序列,所以「Well Hello」可能通過指向'H'的指針)。如果有一個新的外部符號參與您可能會看到它在nm
輸出等。
所有說(哇)...你應該做的事情完全不同。最好的方法是使用源代碼管理系統(例如svn,cvs ...),並對其進行配置,以便您可以執行某些操作來查找代碼庫的哪個版本用於創建可執行文件 - 它應該是任何修訂版的FAQ控制系統。
例如,你可以做一些事情來打印出progarm在開始運行時使用的乘法器或條件,並將其捕獲到日誌中。雖然黑客,宏允許你「串」他們的參數,所以你可以登錄和執行的東西,而無需鍵入所有的代碼兩次。還有很多其他選項。
希望對此有所幫助....
你使用什麼編譯器?你有調試符號嵌入? –
@Tony,對於缺乏信息我感到抱歉,但我主要想知道要搜索的術語以及是否可能。儘管現在不需要,但我會編輯信息以獲取信息。 – Yotam
爲什麼你不按照你想要的方式編譯源文件,並使用該結果?否則,你不知道你有什麼;你正在尋找的那條線可能不是唯一的區別。冒着嚴厲的風險,人們在進行科學實驗時應該小心。 –