在链接时间内在特定部分添加变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在链接时间内在特定部分添加变量相关的知识,希望对你有一定的参考价值。
考虑以下情况:
- 变量X和Y是库的一部分,我们称之为lib.o.我们没有可能调整库的相应源代码(例如添加编译指示)
- X必须链接到除Y之外的其他部分,两者当前都在同一部分中定义
(通常)链接器是否可以将库中的各个变量链接到特定(可能是新的)部分?
这个问题背后的原因是库有缓冲区溢出错误(memclr与小缓冲区(变量X))并覆盖变量Y.临时解决方法(直到库将由卖方修复)将链接变量X到一个部分并留下一些空间,因此memclr不会损害重要的变量。
答案
如果编译器是GCC,并且您可以访问链接器脚本,则实际上可以将整个对象(或其中的特定部分)强制到特定区域,如下所示:
SECTIONS
{
custom_sec :
{
. = ALIGN(4);
//custom_object.o
//custom_object.o (.data)
//custom_object.o (.bss)
}
}
请参阅链接器手册。通常,此功能存在于大多数连接器中。
另一答案
这是Linux的可能解决方案。我们不是使用部分,而是替换可能溢出的每个缓冲区。
lib.c:
#include <stdio.h>
#include <string.h>
char buf[10];
int y;
int main ()
{
y = 42;
printf ("y = %d
", y);
memset (buf, 0, 14);
printf ("y = %d
", y);
return 0;
}
在正常情况下:
$ gcc -o lib.o -c lib.c
$ gcc -o nowrap lib.o
$ ./nowrap
y = 42
y = 0
我们现在将用更大的缓冲区替换buf
。
wrap_buf.c:
char buf[20];
并建立:
$ gcc -o lib.o -c lib.c
$ gcc -o wrap_buf.o -c wrap_buf.c
$ objcopy lib.o --globalize-symbol=buf --weaken-symbol=buf lib2.o
$ gcc -o wrap lib2.o wrap_buf.o
$ ./wrap
y = 42
y = 42
以上是关于在链接时间内在特定部分添加变量的主要内容,如果未能解决你的问题,请参考以下文章
是否有标准或首选标签类型可用于向某个位置添加额外的锚点/片段链接?