在链接期间在特定部分添加变量

时间:2018-09-05 13:35:03

标签: linker embedded

请考虑以下情况:

  • 变量X和Y是库的一部分,我们称之为lib.o。我们无法改编相应的库源代码(例如,添加pragma)
  • X必须链接到除Y以外的其他部分,当前两者均在同一部分中定义

链接程序是否有可能(通常)将单个变量从库链接到特定的(可能是新的)部分?

此问题背后的原因是该库具有缓冲区溢出错误(带有较小缓冲区的memclr(变量X))并覆盖了变量Y。一种临时解决方法(直到卖方将库修复)。将变量X链接到一个节并在后面留一些空间,因此memclr不会损害重要变量。

2 个答案:

答案 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