gpt4 book ai didi

android - 运行时的函数地址与来自可执行二进制文件的函数地址不同

转载 作者:行者123 更新时间:2023-11-30 15:11:02 27 4
gpt4 key购买 nike

在aosp 6.0源代码下,我想构建具有跟踪调用状态的fastboot,因此我添加了以下编译参数“-g -finstrument-functions”来构建二进制文件。

第一

我运行命令“readelf -s xxxxxx(my target binary)”,函数地址如下:

124: 0000000000002390    69 FUNC    GLOBAL DEFAULT   14 usb_open
125: 00000000000021b0 306 FUNC GLOBAL DEFAULT 14 usb_read
126: 0000000000002080 294 FUNC GLOBAL DEFAULT 14 usb_write
127: 0000000000002340 71 FUNC GLOBAL DEFAULT 14 usb_close
128: 00000000000022f0 68 FUNC GLOBAL DEFAULT 14 usb_kick
129: 0000000000002670 151 FUNC GLOBAL DEFAULT 14 usb_wait_for_disconnect
76: 0000000000001f60 286 FUNC GLOBAL DEFAULT 14 main

第二个

我通过跟踪函数获取了运行时函数地址,如下所示:

void main_constructor( void )
{
fp = fopen( "trace.txt", "w" );
if (fp == NULL) exit(-1);
}

void main_deconstructor( void )
{
fclose( fp );
}

void __cyg_profile_func_enter( void *this, void *callsite )
{
fprintf(fp, "E%p\n", (int *)this);
}

void __cyg_profile_func_exit( void *this, void *callsite )
{
fprintf(fp, "X%p\n", (int *)this);
}

但是,函数地址如下:

E0x7fd2a83bbf60
E0x7fd2a83bc390
E0x7fd2a83bc3e0

显然,运行时的函数地址与可执行二进制文件的函数地址不同,运行时的函数地址比静态函数的地址多0X7fd2a83ba000。经过谷歌搜索,似乎是动态库加载模式,但我构建的是可执行二进制文件。 我想知道我应该如何获取与静态二进制文件相同的函数地址。然后我可以使用 addr2line 获取函数名称来生成调用状态图。

(顺便说一句,经过我的调查,我发现android 6.0源代码使用clang来构建主机X86/X86_64程序,所以我猜测这个问题源于Clang的一些编译参数。在android 4.4下,我可以这样做)

非常感谢您的帮助!

最佳答案

AOSP 中的可执行文件正在使用 PIE(位置无关可执行文件)标志进行编译。当二进制文件映射到内存时,每次运行它不会被映射到完全相同的地址。将应用偏移量(基址),从而产生指针地址的差异。如果你确实想禁用 PIE,请添加 LOCAL_NO_FPIE到 fastboot makefile (system/core/fastboot/Android.mk)。您需要将其添加到 include $(CLEAR_VARS) 之后.

要验证它没有编译为 PIE,请调用 hardening-check <executable-file> .

关于android - 运行时的函数地址与来自可执行二进制文件的函数地址不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35840314/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com