#include <stdio.h>
#include <stdlib.h>
#include <bfd.h>

static bfd *abfd;
static int size;
static asymbol **symbols;
static asection *section;

const char *foo()
{
    int ret;
    void *addr;
    const char *file;
    const char *func;
    unsigned int line;

    addr = __builtin_return_address(0);
    ret = bfd_find_nearest_line(abfd, section, symbols, (long)addr,
                                &file, &func, &line);
    return func;
}

const char *bar()
{
    return foo();
}

const char *baz()
{
    return foo();
}

int main()
{
    abfd = bfd_openr("/proc/self/exe", NULL);
    bfd_check_format(abfd, bfd_object);
    size = bfd_get_symtab_upper_bound(abfd);
    symbols = (asymbol**)malloc(size);
    section = bfd_get_section_by_name(abfd, ".debug_info");
    printf("%s\n", bar());
    printf("%s\n", baz());
    free(symbols);
    return 0;
}
