Re: Creating executable shared libraries ?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



mandag 16 august 2004, 17:42, skrev Segher Boessenkool:
> See http://gcc.gnu.org/ml/gcc-help/2003-07/msg00232.html .

Thanks, but I'm still having problems.  The shared library can now be run and 
call functions without a problem, but argc and argv are garbage.  This is a 
problem, because the main function needs to know its invocation name, and it 
also takes arguments.  I suppose I can use readlink with /proc/self/exe to 
get the executable name at least, and possibly /proc/self/cmdline for the 
arguments (gotta try that), but is there another (better) way ?  (Also, 
returning from main segfaults, is that normal ?  Not that *that*'s a problem, 
setting return type to void and just using exit works fine).

Also, I had to change "/lib/ld.so.1" to "/lib/ld-linux.so.2" since the first 
one doesn't exist on my box ("ld-linux.so.2" is a symlink to "ld-2.3.2.so").  
Is there a way to have this work with both (or any ld.so's) without a 
recompile ?  The lib is open source, so compile-time config isn't a problem, 
but it'd be nice if pre-compiled binaries could support both.  (Tried using 
multiple .interp strings, but that didn't seem to work.)

Here's a test program, compiled with (seem to remember that -DPIC from 
somewhere, don't know if it's necessary ?)
gcc -W -Wall -fPIC -DPIC -shared test.c -o test -Wl,-e,my_main

-- 8< --
#include <stdio.h>
#include <stdlib.h>

const char interp[] __attribute__((section(".interp"))) = 
"/lib/ld-linux.so.2";

void my_main (int argc, char *argv[])
{
	printf("argc = %i (%u)\nargv = %p\n", argc, argc, argv);
	printf("*argv = %s\n", *argv);
	exit(0);
}
-- 8< --

Output (the numbers at argc/argv are constant for same arguments, but change 
for different args -- the difference in values seems to hint that the args 
are stored, but the address isn't readable):

-- 8< --
$ ./test
argc = -1073744275 (3221223021)
argv = (nil)
Segmentation fault
$ ./test 1
argc = -1073744277 (3221223019)
argv = 0xbffff672
Segmentation fault
$ ./test 1 2
argc = -1073744279 (3221223017)
argv = 0xbffff670
Segmentation fault
$ ./test 1 23
argc = -1073744280 (3221223016)
argv = 0xbffff66f
Segmentation fault
-- 8< --

Any ideas ?  (Thought about using mprotect, but that seems a bit, eh, hackish 
and insecure..)

- Gerry

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux