Table of Contents

C weak symbols

C weak symbols are linker-level symbols that can be overridden. Declare a function or variable __attribute__((weak)) (GCC/Clang) to allow another compilation unit to provide a strong override. Useful for plugin systems, default implementations, or optional features.

Use weak symbols to provide default implementations that users can override at link time.

Example

// compile: gcc -o weak weak.c default.c plugin.c
// run: ./weak
// description: weak symbols for overridable functions
 
// weak.c (main program)
#include <stdio.h>
 
// Declare as weak - can be overridden
void custom_handler(void) __attribute__((weak));
 
void custom_handler(void) {
    printf("Default handler\n");
}
 
int main() {
    custom_handler();
    return 0;
}
 
// default.c (default implementation)
void default_func(void) {
    printf("Default implementation\n");
}
 
// plugin.c (override)
#include <stdio.h>
 
void custom_handler(void) {
    printf("Plugin override handler\n");
}

Common patterns

Weak function:

Weak variable:

Plugin systems:

Portability:

Limitations:

Best practices: