C LD#U预加载和弱引用最小示例不';行不通

C LD#U预加载和弱引用最小示例不';行不通,c,weak-references,ld-preload,C,Weak References,Ld Preload,这可能会令人尴尬: 我在其他项目中使用库预处理,但我无法让这个最小的示例起作用: weakref.h: void f_weak() __attribute__((weak)); weakref.c: #include <stdio.h> #include "weakref.h" void f_weak(){ printf("f_weak()\n"); fflush(stdout); } #include <stdio.h> #include "wea

这可能会令人尴尬:

我在其他项目中使用库预处理,但我无法让这个最小的示例起作用:

weakref.h:

void f_weak() __attribute__((weak));
weakref.c:

#include <stdio.h>
#include "weakref.h"

void f_weak(){
    printf("f_weak()\n");
    fflush(stdout);
}
#include <stdio.h>
#include "weakref.h"

int main(void)
{
    if (f_weak) {
        printf("main: f_weak()\n");
    }
    else {
        printf("main: ---\n");
    }

    fflush(stdout);
    return 0;
}
#include <stdio.h>
#include "weakref.h"

void f_weak(){
   printf("original\n");
   fflush(stdout);
}
#include <stdio.h>
#include "weakref.h"

int main(void)
{
  f_weak();
  fflush(stdout);
  return 0;
}
最后一个命令的预期输出为

main: f_weak()

我遗漏了什么?

据我所知,只有在调用外部函数时才能解析它们。所以,如果(f_弱)测试总是失败。如果按以下方式操作,您可以看到它是有效的:

weakref.c:

#include <stdio.h>
#include "weakref.h"

void f_weak(){
    printf("f_weak()\n");
    fflush(stdout);
}
#include <stdio.h>
#include "weakref.h"

int main(void)
{
    if (f_weak) {
        printf("main: f_weak()\n");
    }
    else {
        printf("main: ---\n");
    }

    fflush(stdout);
    return 0;
}
#include <stdio.h>
#include "weakref.h"

void f_weak(){
   printf("original\n");
   fflush(stdout);
}
#include <stdio.h>
#include "weakref.h"

int main(void)
{
  f_weak();
  fflush(stdout);
  return 0;
}

我在一个旧的Makefile中找到了解决方案:该程序还必须使用
-fPIC
标志进行编译

$ gcc weakref.c -shared -fPIC -o libweakref.so
$ nm libweakref.so | grep f_weak
0000000000000708 W f_weak
$ gcc test_weakref.c -o test_weakref -fPIC
$ ./test_weakref
main: ---
$ LD_PRELOAD=./libweakref.so ./test_weakref
main: f_weak()

谢谢,但是我的问题出现了,当我使用_属性_((弱))。