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

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

以上是关于在链接时间内在特定部分添加变量的主要内容,如果未能解决你的问题,请参考以下文章

是否有标准或首选标签类型可用于向某个位置添加额外的锚点/片段链接?

仅在特定 div 中使用 javascript 更改部分链接

在 JSP 中的 <% %> 代码片段中添加链接

64 位特定 simd 内在

如何获取片段内在firebase中注册的用户数?

是否可以在 asp.net 上添加指向另一个页面的特定部分的链接?