我有一些用汇编语言编写的代码,需要在运行时复制(复制的代码是用C语言编写的),因此我需要得到函数的大小。我在汇编语言中这样编写了函数:
.globl function_foo
function_foo:
...
...
.globl function_foo_end
function_foo_end:
extern void function_foo(void);
extern void function_foo_end(void);
memcpy(dest, function_foo, (uintptr_t)function_foo_end - (uintptr_t)function_foo);
代码按预期工作,但我担心如果链接过程对符号进行了重新排序,例如如果function_foo_end
被移动到function_foo
之前,或者如果function_foo
和function_foo_end
在内存中不连续,那么memcpy
可能会复制错误的大小。
是否保证这些符号在内存中是有序且连续放置的?
1条答案
按热度按时间r6hnlfcb1#
链接器以节的粒度工作,因此只要标签在同一个
.text
块中,链接器就不会将它们分开。有一些链接后优化工具(如BOLT)可以对二进制代码进行更积极的转换,包括移动标签。
一种替代方法是将程序编译两次:
readelf
或类似方法)-DFUNC_SIZE=...
)将提取的大小传递给第二次编译