From d499f195ad32444c466d927fafa6ecb451936b73 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Fri, 23 Aug 2013 16:24:37 -0700 Subject: [PATCH] Add a simple helper program to find libGL.so.1 This allows us to directly inspect the final result of all of the loader's search-path logic without us needing to implement a compatible version of that logic ourselves, (which is more than trivial). --- .gitignore | 3 ++ Makefile | 15 +++++++++ glaze-find-libgl.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 glaze-find-libgl.c diff --git a/.gitignore b/.gitignore index 7a82f8e..0c349a7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ +config.h glaze.pc +glaze-find-libgl-32 +glaze-find-libgl-64 lib libglaze.so* Makefile.config diff --git a/Makefile b/Makefile index 147dcd5..7630a18 100644 --- a/Makefile +++ b/Makefile @@ -28,10 +28,12 @@ TARGETS = $(LIBGLAZE_LIBNAME) ifeq ($(COMPILER_SUPPORTS_32),Yes) TARGETS += $(LIB32_DIR)/libGL.so.1 +TARGETS += glaze-find-libgl-32 endif ifeq ($(COMPILER_SUPPORTS_64),Yes) TARGETS += $(LIB64_DIR)/libGL.so.1 +TARGETS += glaze-find-libgl-64 endif all: $(TARGETS) @@ -49,6 +51,12 @@ $(LIB32_DIR)/libGL.so.1: glaze-gl.c specs/gl.def mkdir -p $(LIB32_DIR) $(CC) $(GLAZE_CFLAGS) -m32 -fPIC -shared -Wl,-Bsymbolic -o $@ $< +glaze-find-libgl-32: glaze-find-libgl.c + $(CC) $(GLAZE_CFLAGS) -m32 -fPIC -ldl -o $@ $< + +glaze-find-libgl-64: glaze-find-libgl.c + $(CC) $(GLAZE_CFLAGS) -m64 -fPIC -ldl -o $@ $< + .PHONY: install install: all mkdir -p $(DESTDIR)$(LIBDIR)/glaze/$(LIB64_DIR) @@ -62,6 +70,13 @@ install: all install glaze.pc $(DESTDIR)$(LIBDIR)/pkgconfig mkdir -p $(DESTDIR)$(INCLUDEDIR)/glaze install -m0644 glaze.h $(DESTDIR)$(INCLUDEDIR)/glaze + mkdir -p $(DESTDIR)$(BINDIR) +ifeq ($(COMPILER_SUPPORTS_32),Yes) + install -m0755 glaze-find-libgl-32 $(DESTDIR)$(BINDIR) +endif +ifeq ($(COMPILER_SUPPORTS_64),Yes) + install -m0755 glaze-find-libgl-64 $(DESTDIR)$(BINDIR) +endif clean: rm -f $(TARGETS) diff --git a/glaze-find-libgl.c b/glaze-find-libgl.c new file mode 100644 index 0000000..a31af92 --- /dev/null +++ b/glaze-find-libgl.c @@ -0,0 +1,78 @@ +/* Copyright © 2013, Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#define _GNU_SOURCE +#include + +#include + +/* The purpose of this program is very simple. It dynamically loads + * libGL.so.1 and then prints out the filename of the file which was + * loaded. + * + * We use this in Glaze in order to determine the libGL.so.1 library + * that would be loaded if it weren't for us messing around with + * LD_LIBRARY_PATH causing Glaze's libGL.so.1 to be loaded instead. + * + * Using a program like this allows us to directly inspect what the + * dynamic loader actually does. This is much more reliable than + * trying to recreate its search-path logic which would requrie at + * least: + * + * * Parsing LD_LIBRARY_PATH + * + * * Correctly interpreting $LIB within LD_LIBRARY_PATH + * + * * Knowing the canonical name for the current architecture for + * *$LIB + * + * * Parsing /etc/ld.so.conf entries + * + * * etc. etc. + */ +int +main (void) +{ + Dl_info info; + void *handle; + void *function; + + handle = dlopen ("libGL.so.1", RTLD_NOW); + if (handle == NULL) { + fprintf (stderr, "glaze-find-libgl: Failed to dlopen libGL.so.1\n"); + return 1; + } + + function = dlsym (handle, "glClear"); + if (function == NULL) { + fprintf (stderr, "glaze-find-libgl: Failed to dlsym glClear\n"); + return 1; + } + + if (dladdr (function, &info) == 0) { + fprintf (stderr, "glaze-find-libgl: Failed to dladdr glClear\n"); + return 1; + } + + printf ("%s\n", info.dli_fname); + + return 0; +} -- 2.43.0