Добавить переменные в определенный раздел во время ссылки - PullRequest
0 голосов
/ 05 сентября 2018

Рассмотрим следующую ситуацию:

  • Переменные X и Y являются частью библиотеки, назовем ее lib.o. У нас нет возможности адаптировать соответствующий исходный код библиотеки (например, добавить прагмы)
  • X должен быть связан с другим разделом, отличным от Y, оба в настоящее время определены в том же разделе

Возможно ли (в общем) для компоновщика связать отдельные переменные из библиотеки с определенным (возможно, новым) разделом?

Причиной этого вопроса является то, что в библиотеке есть ошибка переполнения буфера (memclr с небольшим буфером (переменная X)) и перезаписывается переменная Y. Временное решение (до тех пор, пока библиотека не будет исправлена ​​продавцом) будет свяжите переменную X с разделом и оставьте немного места, чтобы memclr не повредил важные переменные.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Если компилятор GCC, и, у вас есть доступ к скрипту компоновщика, вы можете фактически принудительно заставить весь объект (или определенные разделы из него) в определенной области, что-то вроде этого:

SECTIONS {<br> custom_sec : { . = ALIGN(4); //custom_object.o //custom_object.o (.data) //custom_object.o (.bss) } }

Обратитесь к руководству по компоновщику. Обычно эта функция присутствует в большинстве компоновщиков.

0 голосов
/ 05 сентября 2018

Вот возможное решение для 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
...