[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Hash banging #! - Distributing precompiled sharable linux binaries

John Carter

6/28/2007 2:57:00 AM

1 Answer

Ken Bloom

6/28/2007 1:38:00 PM

0

Guess what. JRuby of all things runs into this problem[1], and they
refuse bundle a fix.

Perhaps someone would also like to report this issue to the Linux-Kernel
Mailing List, although it could be years before a fix sufficiently
widespread in the wild for us to stop having to work around it.

--Ken

[1] http://jira.codehaus.org/browse/...

On Thu, 28 Jun 2007 11:57:29 +0900, John Carter wrote:
> This may, in a very odd set of circumstances, be useful to somebody....
>
> If you try interpret a #! script with another #! script it fails. (I
> wrote about this problem before..)
> http://tinyurl....
>
> One fix is to use #!/usr/bin/env in the interpreted script, but doesn't
> help you is you wish, as I did, to interpose something between lots and
> lots of #!/usr/bin/ruby scripts and ruby.
>
> Here is another way, write a wee C program that does it for you....
>
> In this case it wraps a ruby in an invocation of ld-linux.so.2 that
> loads up the copies of the latest libraries so a precompiled version
> will run on an old machine / distro....
>
>
> // Autogenerated
>
> #include <unistd.h>
> #include <stdio.h>
> #include <stdlib.h>
>
> const char LD_LINUX
> []="/opt/ruby/ruby-1.8.6-p36/dll_hell-1.0/ld-linux.so.2"; const char
> DLL_HELL []="/opt/ruby/ruby-1.8.6-p36/dll_hell-1.0"; const char
> BARE_RUBY []="/opt/ruby/ruby-1.8.6-p36/bin/.__bare__ruby"; /* We've
> been called as...
> ruby arg_1 arg_2... arg_argc-1
>
> must call..
> ld-linux-so.2 --library-path dll_hell /opt/..../bare_ruby
> */
>
> int main( int argc, char * argv[])
> {
> int i;
> int new_argc = argc+3;
> const char ** new_argv = (const char**)malloc(
> sizeof(char*)*new_argc + 1);
>
> /*
> printf("argc=%d\n",argc);
> for( i = 0; i <= argc; ++i) {
> printf( "argv[%3d]=%s\n",i, argv[i]);
> }
> */
> new_argv[0] = "ruby";
> new_argv[1] = "--library-path";
> new_argv[2] = DLL_HELL;
> new_argv[3] = BARE_RUBY;
>
> for( i = 1; i <= argc; ++i) {
> new_argv[i+3] = argv[i];
> }
> /*
> printf("\nnew_argc=%d\n",new_argc);
> for( i = 0; i <= new_argc; ++i) {
> printf( "new_argv[%3d]=%s\n",i, new_argv[i]);
> }
>
> */
> execv( LD_LINUX, (char * const *)new_argv);
>
> perror( "Should haved execv'ed!");
> return 1;
> }



--
Ken Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu...