Skip to content

Instantly share code, notes, and snippets.

@CyberLight
Forked from bindle/test-dlsym.c
Created April 3, 2017 11:01
Show Gist options
  • Save CyberLight/b01b170bf0ef975b7305e1eb4fee2a2f to your computer and use it in GitHub Desktop.
Save CyberLight/b01b170bf0ef975b7305e1eb4fee2a2f to your computer and use it in GitHub Desktop.
simple example of dlsym()
/*
* Quick example to test dlsym()
* build: gcc -W -Wall -Werror -o test-dlsym test-dlsym.c
* Usage: ./test-dlsym openldap
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
typedef struct package_data PackageData;
struct package_data
{
const char * identifier;
const char * name;
const char * website;
const char * version;
const char * license;
};
const PackageData pkgdata_cyrus_sasl =
{
"cyrus_sasl", "Cyrus SASL", "http://asg.web.cmu.edu/sasl/", "2.1.23", NULL
};
const PackageData pkgdata_openldap =
{
"openldap", "OpenLDAP", "http://www.openldap.org/", "2.4.22", NULL
};
const PackageData pkgdata_openssl =
{
"openssl", "OpenSSL SSL/TLS Toolkit", "http://www.openssl.org/", "1.0.0a", NULL
};
const PackageData pkgdata_pcre =
{
"pcre", "Perl Compatible Regular Expressions", "http://www.pcre.org/", "8.10", NULL
};
int main(int argc, char * argv[])
{
char symbol_name[512];
unsigned u;
const PackageData * datap;
if (argc != 2)
{
fprintf(stderr, "Usage: %s <identifier>\n", argv[0]);
return(1);
};
snprintf(symbol_name, 512, "pkgdata_%s", argv[1]);
for(u = 0; u < strlen(symbol_name); u++)
{
if ((symbol_name[u] >= 'A') && (symbol_name[u] <= 'Z'))
symbol_name[u] = symbol_name[u] - 'A' +'a';
else if ( ((symbol_name[u] < 'a') || (symbol_name[u] > 'z')) &&
((symbol_name[u] < '0') || (symbol_name[u] > '9')) )
symbol_name[u] = '_';
};
if (!(datap = (const struct package_data *) dlsym(RTLD_SELF, symbol_name)))
{
fprintf(stderr, "%s: unknown package -- %s\n", argv[0], argv[1]);
return(1);
};
printf("Identifier: %s\n", datap->identifier ? datap->identifier : "unknown");
printf("Name: %s\n", datap->name ? datap->name : "unknown");
printf("Version: %s\n", datap->version ? datap->version : "unknown");
printf("Website: %s\n", datap->website ? datap->website : "unknown");
printf("License: %s\n", datap->license ? datap->license : "unknown");
return(0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment