Сейчас на форуме: rmn, exp50848 (+8 невидимых)

 eXeL@B —› Основной форум —› gcc -> сгенерить FLIRT сигнатуры
Посл.ответ Сообщение

Ранг: 171.0 (ветеран), 11thx
Активность: 0.050
Статус: Участник

Создано: 12 сентября 2015 07:20 · Поправил: Apokrif
· Личное сообщение · #1

Народ, подскажите куда копать.
Подбираю ключи компилятора, чтобы сгенерить сигнатуры для LUA.
Нашел простую функцию в декомпилируемой либе и пытаюсь получить такую же при компиляции исходников.

gfind_nodef.c
Code:
  1. static int gfind_nodef (lua_State *L) {
  2.   return luaL_error(L, LUA_QL("string.gfind") " was renamed to "
  3.                        LUA_QL("string.gmatch"));
  4. }

gcc-4.4.3
Похоже, что оптимизация полностью отключена (-O0) и есть стек фрэйм (адресация параметров идет через R11)
lib.so
Code:
  1. .text:0087063C                 STMFD   SP!, {R11,LR}
  2. .text:00870640                 ADD     R11, SP, #4
  3. .text:00870644                 SUB     SP, SP, #8
  4. .text:00870648                 STR     R0, [R11,#var_8]
  5. .text:0087064C                 LDR     R0, [R11,#var_8]
  6. .text:00870650                 LDR     R3, =(aString_gfindWa - 0x87065C)
  7. .text:00870654                 ADD     R3, PC, R3      ; "'string.gfind' was renamed to 'string.g"...
  8. .text:00870658                 MOV     R1, R3
  9. .text:0087065C                 BL      sub_855E74
  10. .text:00870660                 MOV     R3, R0
  11. .text:00870664                 MOV     R0, R3
  12. .text:00870668                 SUB     SP, R11, #4
  13. .text:0087066C                 LDMFD   SP!, {R11,PC}

У меня (-O0) все почти тоже самое, но НЕТ указателя на стек фрэйм (R11) и адресация параметров идет через SP
Code:
  1. .text.gfind_nodef:000025DC                 STR     LR, [SP,#var_4]!
  2. .text.gfind_nodef:000025E0                 SUB     SP, SP, #0xC
  3. .text.gfind_nodef:000025E4                 STR     R0, [SP,#0x10+L]
  4. .text.gfind_nodef:000025E8                 LDR     R0, [SP,#0x10+L]
  5. .text.gfind_nodef:000025EC                 LDR     R3, =(unk_36F-0x278F)
  6. .text.gfind_nodef:000025F0                 ADD     R3, PC, R3      ; "'string.gfind' was renamed to 'string.g"...
  7. .text.gfind_nodef:000025F4                 MOV     R1, R3
  8. .text.gfind_nodef:000025F8                 BL      luaL_error      ; PIC mode
  9. .text.gfind_nodef:000025FC                 MOV     R3, R0
  10. .text.gfind_nodef:00002600                 MOV     R0, R3
  11. .text.gfind_nodef:00002604                 ADD     SP, SP, #0xC
  12. .text.gfind_nodef:00002608                 LDMFD   SP!, {PC}

Все ключи тут.
-fomit-frame-pointer
Don't keep the frame pointer in a register for functions that don't need one. This avoids the instructions to save, set up and restore frame pointers; it also makes an extra register available in many functions.

Проверил omit-frame-pointer для -O0
-O0 -Q --help=optimizers
-fomit-frame-pointer [disabled]

Или я неправильно понимаю omit-frame-pointer или что-то еще упускаю...
Протрахался день и ночь, куда еще копать?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 12 сентября 2015 08:44
· Личное сообщение · #2

это у тебя что то с gcc
потому что бай дефолт это

Code:
  1. LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) {
  2.   /* keep some extra space to run error routines, if needed */
  3.   const int extra = LUA_MINSTACK;
  4.   if (!lua_checkstack(L, space + extra)) {
  5.     if (msg)
  6.       luaL_error(L, "stack overflow (%s)", msg);
  7.     else
  8.       luaL_error(L, "stack overflow");
  9.   }
  10. }

Code:
  1. .text:000105EC sub_105EC
  2. .text:000105EC                 STMFD   SP!, {R3-R5,LR}
  3. .text:000105F0                 ADD     R1, R1, #0x14
  4. .text:000105F4                 MOV     R4, R2
  5. .text:000105F8                 MOV     R5, R0
  6. .text:000105FC                 BL      _lua_checkstack_sub_DE9C
  7. .text:00010600                 CMP     R0, #0
  8. .text:00010604                 LDMNEFD SP!, {R3-R5,PC}
  9. .text:00010608                 CMP     R4, #0
  10. .text:0001060C                 MOV     R0, R5
  11. .text:00010610                 BEQ     loc_10624
  12. .text:00010614                 MOV     R2, R4
  13. .text:00010618                 LDMFD   SP!, {R3-R5,LR}
  14. .text:0001061C                 LDR     R1, =aStackOverflowS ; "stack overflow (%s)"
  15. .text:00010620                 B       _luaL_error_sub_101AC
  16. .text:00010624 ; ---------------------------------------------------------------------------
  17. .text:00010624
  18. .text:00010624 loc_10624                               ; CODE XREF: sub_105EC+24j
  19. .text:00010624                 LDR     R1, =aStackOverflow ; "stack overflow"
  20. .text:00010628                 LDMFD   SP!, {R3-R5,LR}
  21. .text:0001062C                 B       _luaL_error_sub_101AC
  22. .text:0001062C ; End of function sub_105EC




Ранг: 171.0 (ветеран), 11thx
Активность: 0.050
Статус: Участник

Создано: 12 сентября 2015 19:16 · Поправил: Apokrif
· Личное сообщение · #3

reversecode пишет:
это у тебя что то с gcc
потому что бай дефолт это

Извините, я не понял при чём тут "бай дефолт"?
В вашем примере все параметры передаются через регистры, а не через стек.
У меня в обоих случаях параметры передаются через стек, но адресуются по-разному, через bp/r11 или sp.
В остальном весь код с моих вариантах совпадает.

Для функции из вашего примера, в LUA 5.1.4 она:
Code:
  1. LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) {
  2.   if (!lua_checkstack(L, space))
  3.     luaL_error(L, "stack overflow (%s)", mes);
  4. }


И gcc4.4.3 БЕЗ оптимизации (-O0) даёт:
Code:
  1. .text.luaL_checkstack:00000770 ; void __cdecl luaL_checkstack(lua_State_0 *L, int space, const unsigned __int8 *mes)
  2. .text.luaL_checkstack:00000770                 EXPORT luaL_checkstack
  3. .text.luaL_checkstack:00000770 luaL_checkstack
  4. .text.luaL_checkstack:00000770
  5. .text.luaL_checkstack:00000770 mes             = -0x14
  6. .text.luaL_checkstack:00000770 space           = -0x10
  7. .text.luaL_checkstack:00000770 L               = -0xC
  8. .text.luaL_checkstack:00000770 var_4           = -4
  9. .text.luaL_checkstack:00000770
  10. .text.luaL_checkstack:00000770                 STR     LR, [SP,#var_4]!
  11. .text.luaL_checkstack:00000774                 SUB     SP, SP, #0x14
  12. .text.luaL_checkstack:00000778                 STR     R0, [SP,#0x18+L]
  13. .text.luaL_checkstack:0000077C                 STR     R1, [SP,#0x18+space]
  14. .text.luaL_checkstack:00000780                 STR     R2, [SP,#0x18+mes]
  15. .text.luaL_checkstack:00000784                 LDR     R0, [SP,#0x18+L]
  16. .text.luaL_checkstack:00000788                 LDR     R1, [SP,#0x18+space]
  17. .text.luaL_checkstack:0000078C                 BL      lua_checkstack  ; PIC mode
  18. .text.luaL_checkstack:00000790                 MOV     R3, R0
  19. .text.luaL_checkstack:00000794                 CMP     R3, #0
  20. .text.luaL_checkstack:00000798                 BNE     loc_7B4
  21. .text.luaL_checkstack:0000079C                 LDR     R0, [SP,#0x18+L] ; L
  22. .text.luaL_checkstack:000007A0                 LDR     R3, =(unk_19F-0x88B)
  23. .text.luaL_checkstack:000007A4                 ADD     R3, PC, R3      ; "stack overflow (%s)"
  24. .text.luaL_checkstack:000007A8                 MOV     R1, R3          ; fmt
  25. .text.luaL_checkstack:000007AC                 LDR     R2, [SP,#0x18+mes]
  26. .text.luaL_checkstack:000007B0                 BL      luaL_error      ; PIC mode
  27. .text.luaL_checkstack:000007B4
  28. .text.luaL_checkstack:000007B4 loc_7B4                                 ; CODE XREF: luaL_checkstack+28 j
  29. .text.luaL_checkstack:000007B4                 ADD     SP, SP, #0x14
  30. .text.luaL_checkstack:000007B8                 LDMFD   SP!, {PC}
  31. .text.luaL_checkstack:000007B8 ; End of function luaL_checkstack

Т.е. точно также все параметры передаются через стек, а не через регистры.
У вас похоже включена оптимизация (-O)
Скомпилите с -frecord-options-in-elf и посмотрите ваши ключи.

Или вы что-то другое имели ввиду?

Добавлено спустя 1 час 20 минут
Уф, вроде разобрался!
Android NDK генерит ключи ... -O2 -fomit-frame-pointer ... -O0 ...
"-O2 -fomit-frame-pointer" - всегда автоматом, даже в debug mode
"-O0" - моё
В результате получается -fomit-frame-pointer [enabled]
Поменял своё на -O0 -fno-omit-frame-pointer и получил -fomit-frame-pointer [disabled]
И код совпал один в один!

Модераторы, вряд ли это тема кому интересно, может просто стереть её?


 eXeL@B —› Основной форум —› gcc -> сгенерить FLIRT сигнатуры
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати