请考虑以下情况:
链接程序是否有可能(通常)将单个变量从库链接到特定的(可能是新的)部分?
此问题背后的原因是该库具有缓冲区溢出错误(带有较小缓冲区的memclr(变量X))并覆盖了变量Y。一种临时解决方法(直到卖方将库修复)。将变量X链接到一个节并在后面留一些空间,因此memclr不会损害重要变量。
答案 0 :(得分:0)
如果编译器是GCC,并且, 您有权访问链接程序脚本,实际上可以将整个对象(或其中的特定部分)强制到特定区域,如下所示:
SECTIONS
{
custom_sec :
{
. = ALIGN(4);
//custom_object.o
//custom_object.o (.data)
//custom_object.o (.bss)
}
}
请查阅链接器手册。通常,大多数链接器都具有此功能。
答案 1 :(得分:-1)
这是适用于Linux的解决方案。
lib.c:
#include <stdio.h>
#include <string.h>
char buf[10];
int y;
int main ()
{
y = 42;
printf ("y = %d\n", y);
memset (buf, 0, 14);
printf ("y = %d\n", 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