gozer       2004/09/21 14:35:30

  Modified:    .        Changes
               lib/ModPerl Code.pm WrapXS.pm
               src/modules/perl .cvsignore mod_perl.c
  Log:
  Generate modperl_exports.c for static builds to prevent the
  linker from stripping needed but unused symbols
  
  Revision  Changes    Path
  1.494     +3 -0      modperl-2.0/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/Changes,v
  retrieving revision 1.493
  retrieving revision 1.494
  diff -u -r1.493 -r1.494
  --- Changes   21 Sep 2004 07:46:22 -0000      1.493
  +++ Changes   21 Sep 2004 21:35:29 -0000      1.494
  @@ -12,6 +12,9 @@
   
   =item 1.99_17-dev
   
  +Generate modperl_exports.c for static builds to prevent the
  +linker from stripping needed but unused symbols [Gozer]
  +
   Add .libs/ as part of the library search path when building
   against httpd's source tree [Gozer]
   
  
  
  
  1.126     +8 -1      modperl-2.0/lib/ModPerl/Code.pm
  
  Index: Code.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/ModPerl/Code.pm,v
  retrieving revision 1.125
  retrieving revision 1.126
  diff -u -r1.125 -r1.126
  --- Code.pm   2 Jul 2004 19:04:32 -0000       1.125
  +++ Code.pm   21 Sep 2004 21:35:30 -0000      1.126
  @@ -637,6 +637,7 @@
      generate_largefiles         => {h => 'modperl_largefiles.h'},
      generate_constants          => {h => 'modperl_constants.h',
                                      c => 'modperl_constants.c'},
  +   generate_exports            => {c => 'modperl_exports.c'},
   );
   
   my @c_src_names = qw(interp tipool log config cmd options callback handler
  @@ -645,7 +646,7 @@
                        const constants apache_compat error debug
                        common_util common_log);
   my @h_src_names = qw(perl_unembed);
  -my @g_c_names = map { "modperl_$_" } qw(hooks directives flags xsinit);
  +my @g_c_names = map { "modperl_$_" } qw(hooks directives flags xsinit exports);
   my @c_names   = ('mod_perl', (map "modperl_$_", @c_src_names));
   sub c_files { [map { "$_.c" } @c_names, @g_c_names] }
   sub o_files { [map { "$_.o" } @c_names, @g_c_names] }
  @@ -1083,6 +1084,12 @@
                   unless $seen_const{$class}{$name}
           }
       }
  +}
  +
  +sub generate_exports {
  +    my($self, $c_fh) = @_;
  +    require ModPerl::WrapXS;
  +    ModPerl::WrapXS->generate_exports($c_fh);
   }
   
   # src/modules/perl/*.c files needed to build APR/APR::* outside
  
  
  
  1.80      +30 -0     modperl-2.0/lib/ModPerl/WrapXS.pm
  
  Index: WrapXS.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/ModPerl/WrapXS.pm,v
  retrieving revision 1.79
  retrieving revision 1.80
  diff -u -r1.79 -r1.80
  --- WrapXS.pm 21 Sep 2004 05:54:56 -0000      1.79
  +++ WrapXS.pm 21 Sep 2004 21:35:30 -0000      1.80
  @@ -1267,5 +1267,35 @@
       return \%stats;
   }
   
  +sub generate_exports {
  +    my($self, $fh) = @_;
  +
  +    if (!$build->should_build_apache) {
  +        print $fh <<"EOF";
  +/* This is intentionnaly left blank, only usefull for static build */
  +const void *modperl_ugly_hack = NULL;
  +EOF
  +        return;
  +    }
  +    
  +    print $fh <<"EOF";
  +/* 
  + * This is indeed a ugly hack!
  + * See also src/modules/perl/mod_perl.c for modperl_ugly_hack
  + * If we don't build such a list of exported API functions, the over-zealous
  + * linker can and will remove the unused functions completely. In order to
  + * avoid this, we create this object and modperl_ugly_hack to create a 
  + * dependency between all the exported API and mod_perl.c
  + */
  +const void *modperl_ugly_hack = NULL;
  +EOF
  +
  +    for my $entry (@$ModPerl::FunctionTable) {
  +        next if $self->func_is_static($entry);
  +        ( my $name ) = $entry->{name} =~ /^modperl_(.*)/;
  +        print $fh "const void *modperl_hack_$name = (const void *)modperl_$name;\n";
  +    }
  +}
  +
   1;
   __END__
  
  
  
  1.13      +1 -0      modperl-2.0/src/modules/perl/.cvsignore
  
  Index: .cvsignore
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/.cvsignore,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- .cvsignore        11 Sep 2004 00:07:33 -0000      1.12
  +++ .cvsignore        21 Sep 2004 21:35:30 -0000      1.13
  @@ -1,3 +1,4 @@
  +modperl_exports.c
   modperl_hooks.h
   modperl_hooks.c
   modperl_flags.h
  
  
  
  1.222     +11 -0     modperl-2.0/src/modules/perl/mod_perl.c
  
  Index: mod_perl.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.c,v
  retrieving revision 1.221
  retrieving revision 1.222
  diff -u -r1.221 -r1.222
  --- mod_perl.c        18 Sep 2004 04:33:34 -0000      1.221
  +++ mod_perl.c        21 Sep 2004 21:35:30 -0000      1.222
  @@ -1034,6 +1034,17 @@
       return retval;
   }
   
  +/* This ugly hack pulls in any function listed in
  + * modperl_exports.c. Otherwise, the over-zealous
  + * linker would remove unused api functions
  + */
  +const void *modperl_suck_in_ugly_hack(void);
  +const void *modperl_suck_in_ugly_hack(void)
  +{
  +    extern const void *modperl_ugly_hack;
  +    return modperl_ugly_hack;
  +}
  +
   module AP_MODULE_DECLARE_DATA perl_module = {
       STANDARD20_MODULE_STUFF, 
       modperl_config_dir_create, /* dir config creater */
  
  
  

Reply via email to