питане
2 отговора
226 прегледа
питане
Имам ARM7T ядро и много C код, дето е написан да работи в thumb mode.
Питането ми е:
Възможно ли е да проследя (на едно ниво) откъде дадена функция е била извикана, но без да ползвам инлайн асемблера? Например чрез функция, написана в ARM mode. Проблема ми е, че кода няма строго дефинирани frame pointers и не мога да определя къде е края на контекста и началото на локалните променливи.
Причината да не ползвам инлайн асемблера е, че през него не мога да викам ARM mode инструкции, а thumb инлайн асемблера не се поддържа от по-новите версии на компилатора.
Т.е. с други думи искам да направя следното:
void myfunc(void)
{
int blah1, blah2, blah[100];
// .. други декларации и инициализации
int x = get_caller();
}
в х искам да имам адреса на функцията, извикала myfunc().
Ето ви и един пример:
Някои функции имат следния вход:
push {r4-r5,r7,r14}
и изход:
pop {r4-r5,r7}
pop {r3}
bx r3
Други обаче имат различен вход:
push {r0-r1,r4-r7,r14}
sub sp,#0x1C
и , разбира се, различен изход:
add sp,#0x24
pop {r4-r7}
pop {r3}
bx r3
Както виждате, няма начин, (поне аз така мисля) по който да "усетя" с колко трябва да скокна в стека и да извадя адреса за връщане (r14) от предната функция.
Моля ви, ако някой има някаква идея да я сподели с мен.
Ще съм много благодарен.
Питането ми е:
Възможно ли е да проследя (на едно ниво) откъде дадена функция е била извикана, но без да ползвам инлайн асемблера? Например чрез функция, написана в ARM mode. Проблема ми е, че кода няма строго дефинирани frame pointers и не мога да определя къде е края на контекста и началото на локалните променливи.
Причината да не ползвам инлайн асемблера е, че през него не мога да викам ARM mode инструкции, а thumb инлайн асемблера не се поддържа от по-новите версии на компилатора.
Т.е. с други думи искам да направя следното:
void myfunc(void)
{
int blah1, blah2, blah[100];
// .. други декларации и инициализации
int x = get_caller();
}
в х искам да имам адреса на функцията, извикала myfunc().
Ето ви и един пример:
Някои функции имат следния вход:
push {r4-r5,r7,r14}
и изход:
pop {r4-r5,r7}
pop {r3}
bx r3
Други обаче имат различен вход:
push {r0-r1,r4-r7,r14}
sub sp,#0x1C
и , разбира се, различен изход:
add sp,#0x24
pop {r4-r7}
pop {r3}
bx r3
Както виждате, няма начин, (поне аз така мисля) по който да "усетя" с колко трябва да скокна в стека и да извадя адреса за връщане (r14) от предната функция.
Моля ви, ако някой има някаква идея да я сподели с мен.
Ще съм много благодарен.
Re: питане
Какъв компилатор ползваш?
[линк]
Погледни горния линк - __return_address().
[линк]
Погледни горния линк - __return_address().
Re: питане
Ами компилатора е ADS Thumb C compliler 1.2
Обаче тези функции не се поддържат от него.
Обаче тези функции не се поддържат от него.