⛏️ index : haiku.git

#!/bin/sh

# program
#
# dlopen():
# libb.so
# <- libb_dependency.so
# liba.so
#
# Expected: Global lookup: Symbol in libb_dependency.so supersedes symbol in
# liba.so.


. ./test_setup


# create liba.so
cat > liba.c << EOI
int a() { return 1; }
EOI

# build
compile_lib -o liba.so liba.c


# create libb_dependency.so
cat > libb_dependency.c << EOI
int a() { return 2; }
EOI

# build
compile_lib -o libb_dependency.so libb_dependency.c


# create libb.so
cat > libb.c << EOI
int b() { return 1; }
EOI

# build
compile_lib -o libb.so libb.c ./libb_dependency.so


# create program
cat > program.c << EOI
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
int
main()
{
	void* liba;
	void* libb;
	void* self;
	int (*a)();

	libb = dlopen("./libb.so", RTLD_NOW | RTLD_GLOBAL);
	if (libb == NULL) {
		fprintf(stderr, "Error opening libb.so: %s\n", dlerror());
		exit(117);
	}

	liba = dlopen("./liba.so", RTLD_NOW | RTLD_GLOBAL);
	if (liba == NULL) {
		fprintf(stderr, "Error opening liba.so: %s\n", dlerror());
		exit(117);
	}

	self = dlopen(NULL, RTLD_NOW | RTLD_GLOBAL);
	if (self == NULL) {
		fprintf(stderr, "Error opening self: %s\n", dlerror());
		exit(117);
	}

	a = (int (*)())dlsym(self, "a");
	if (a == NULL) {
		fprintf(stderr, "Error getting symbol a: %s\n", dlerror());
		exit(116);
	}

	return a();
}
EOI

# build
compile_program_dl -o program program.c

# run
test_run_ok ./program 2