Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Undefined function sensing

Tags:

c

gcc

I am trying to do this (is this possible?) with GCC compiler:

Specifiy a function but this function if is not implemented point to a NULL. Example:

extern void something(uint some);

And if this is unimplemented point to a NULL value.

So it's possible check like this:

something != NULL ? something(222) : etc.;

I would like solution with trough GCC (this could be solvable with function pointers).

like image 968
Danijel Avatar asked Jun 23 '26 22:06

Danijel


2 Answers

This is definitely not portable, but gcc can do this with weak symbols on some platforms. I know this works on Linux and *BSD, but doesn't work on MacOS.

$ cat weak.c
#include <stdio.h>

extern int foo(void) __attribute__((__weak__));

int
main(int argc, char **argv)
{
    int x = foo ? foo() : 42;

    printf("%d\n", x);
    return 0;
}
$ cat weak2.c
int
foo(void)
{
    return 17;
}
$ cc -o weak weak.c && ./weak
42
$ cc -o weak weak.c weak2.c && ./weak
17
$
like image 190
Art Avatar answered Jun 25 '26 12:06

Art


You can do this using GCC's weakref attribute:

extern void something(int);
static void something_else(int) __attribute__((weakref("something")));

int main()
{
  if (something_else)
    something_else(122);
}

If something is not defined in the program then the weak alias something_else will have an address of zero. If something is defined, something_else will be an alias for it.

like image 36
Jonathan Wakely Avatar answered Jun 25 '26 11:06

Jonathan Wakely



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!