-
-
Save CyberLight/b01b170bf0ef975b7305e1eb4fee2a2f to your computer and use it in GitHub Desktop.
simple example of dlsym()
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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