#include <stdio.h> // fprintf(), NULL
#include <stdlib.h> // exit(), EXIT_SUCCESS
#include <string.h>
#include <dlfcn.h>
#include <mach-o/dyld.h>
#include "test.h" // PASS(), FAIL(), XPASS(), XFAIL()
int bar()
{
return 2;
}
static int foo()
{
return 3;
}
int bar2()
{
return 4;
}
static void verifybar()
{
Dl_info info;
if ( dladdr(&bar, &info) == 0 ) {
FAIL("dladdr(&bar, xx) failed");
exit(0);
}
if ( strcmp(info.dli_sname, "bar") != 0 ) {
if ( strcmp(info.dli_sname, "_bar") == 0 ) {
XFAIL("dladdr()->dli_sname is \"%s\" instead of \"bar\"", info.dli_sname);
}
else {
FAIL("dladdr()->dli_sname is \"%s\" instead of \"bar\"", info.dli_sname);
exit(0);
}
}
if ( info.dli_saddr != &bar) {
FAIL("dladdr()->dli_saddr is not &bar");
exit(0);
}
if ( info.dli_fbase != _dyld_get_image_header_containing_address(&bar) ) {
FAIL("dladdr()->dli_fbase is not image that contains &bar");
exit(0);
}
}
static void verifyfoo()
{
Dl_info info;
if ( dladdr(&foo, &info) == 0 ) {
FAIL("dladdr(&foo, xx) failed");
exit(0);
}
if ( strcmp(info.dli_sname, "bar") != 0 ) {
if ( strcmp(info.dli_sname, "_bar") == 0 ) {
XFAIL("dladdr()->dli_sname is \"%s\" instead of \"bar\"", info.dli_sname);
}
else {
FAIL("dladdr()->dli_sname is \"%s\" instead of \"bar\"", info.dli_sname);
exit(0);
}
}
if ( info.dli_saddr != &bar) {
FAIL("dladdr()->dli_saddr is not &bar");
exit(0);
}
if ( info.dli_fbase != _dyld_get_image_header_containing_address(&bar) ) {
FAIL("dladdr()->dli_fbase is not image that contains &bar");
exit(0);
}
}
int main()
{
verifybar();
verifyfoo();
PASS("dladdr");
return EXIT_SUCCESS;
}