Ticket #502 (closed bug: fixed)
[PATCH] build on OpenBSD/ppc
Reported by: | smallm | Owned by: | |
---|---|---|---|
Priority: | normal | Milestone: | |
Component: | core | Version: | trunk |
Severity: | medium | Keywords: | build |
Cc: | Language: | ||
Patch status: | Platform: | openbsd |
Description
I see the same errors Steve Peters reported in rt.perl.org incident 40959 when attempting to build parrot on OpenBSD/ppc:
src/asmfun.s: Assembler messages: src/asmfun.s:6: Error: unsupported relocation against f14 src/asmfun.s:6: Error: unsupported relocation against r1 ...
It looks like there was an attempt to deal with this in config/init/hints/openbsd.pm with this line:
if ( ( split( m/-/, $conf->data->get_p5('archname'), 2 ) )[0] eq 'powerpc' ) {
$conf->data->set( as => 'as -mregnames' );
}
The -mregnames argument would let asmfun.s be assembled, but AS=as -mregnames never gets used because of this rule in the Makefile:
# XXX probably should detect assembler, but right now this is only used on Sparc
.s$(O) : # suffix rule (limited support)
@$(PERL) tools/dev/cc_flags.pl $(CUR_DIR)/CFLAGS $(CC) "" $(CFLAGS) -I$(@D) -o $@ -c $<
I tried putting the arg in CFLAGS like this (don't use this):
--- config/init/hints/openbsd.pm Wed Mar 11 17:12:11 2009 +++ config/init/hints/openbsd.pm.new Wed Mar 25 16:41:53 2009 @@ -13,6 +13,10 @@ if ( $ccflags !~ /-pthread/ ) { $ccflags .= ' -pthread'; } + if ( ( split( m/-/, $conf->data->get_p5('archname'), 2 ) )[0] eq 'powerpc' ) { + $ccflags .= ' -mregnames'; + } + $conf->data->set( ccflags => $ccflags ); my $libs = $conf->data->get('libs'); @@ -30,11 +34,6 @@ libparrot_shared_alias => 'libparrot$(SHARE_EXT)', libparrot_soname => '-Wl,-soname=libparrot$(SHARE_EXT).$(SOVERSION)', ); - - if ( ( split( m/-/, $conf->data->get_p5('archname'), 2 ) )[0] eq 'powerpc' ) { - $conf->data->set( as => 'as -mregnames' ); - } - } 1;
That got it further along in the compile (but later the function in asmfun.o failed to be found by the linker) and I hit this error:
cc -I./include -fno-delete-null-pointer-checks -pipe -I/usr/local/include -pthread -DHASATTRIBUTE_CONST -DHASATTRIBUTE_DEPRECATED -DHASATTRIBUTE_MALLOC -DHASATTRIBUTE_NONNULL -DHASATTRIBUTE_NORETURN -DHASATTRIBUTE_PURE -DHASATTRIBUTE_UNUSED -falign-functions=16 -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment -Wdisabled-optimization -Wendif-labels -Wformat -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winline -Wmissing-braces -Wno-missing-format-attribute -Wpacked -Wparentheses -Wpointer-arith -Wreturn-type -Wsequence-point -Wno-shadow -Wsign-compare -Wstrict-aliasing -Wswitch -Wswitch-default -Wtrigraphs -Wundef -Wunknown-pragmas -Wno-unused -Wwrite-strings -Wbad-function-cast -Wimplicit-function-declaration -Wimplicit-int -Wmain -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wnonnull -g -DHAS_JIT -DPPC -DHAVE_COMPUTED_GOTO -DPIC -fPIC -I. -o xx.o -c xx.c src/exec_save.c src/exec_save.c: In function `Parrot_exec_save': src/exec_save.c:343: error: `R_PPC_REL24' undeclared (first use in this function) src/exec_save.c:343: error: (Each undeclared identifier is reported only once src/exec_save.c:343: error: for each function it appears in.) src/exec_save.c:350: error: `R_PPC_ADDR16_HI' undeclared (first use in this function) src/exec_save.c:362: error: `R_PPC_ADDR16_LO' undeclared (first use in this function) gmake: *** [src/exec_save.o] Error 1
These constants can be pulled from GNU binutils ( http://www.openbsd.org/cgi-bin/cvsweb/src/gnu/usr.bin/binutils/include/elf/ppc.h?rev=1.6;content-type=text%2Fplain;only_with_tag=MAIN). I have a diff attached for that.
With that patch applied I get to the link but hit this error:
g++ -o miniparrot src/main.o src/null_config.o \ -Wl,-R/home/smallm/src/external/devel/perl/parrot/blib/lib -L/home/smallm/src/external/devel/perl/parrot/blib/lib -lparrot -lpthread -lm -L/usr/local/lib -licuuc -licudata -lpthread -lm -lm -lutil -lpthread -lreadline -lncurses -Wl,-E /home/smallm/src/external/devel/perl/parrot/blib/lib/libparrot.so: warning: vsprintf() is often misused, please use vsnprintf() /home/smallm/src/external/devel/perl/parrot/blib/lib/libparrot.so: warning: strcpy() is almost always misused, please use strlcpy() /home/smallm/src/external/devel/perl/parrot/blib/lib/libparrot.so: warning: sprintf() is often misused, please use snprintf() /home/smallm/src/external/devel/perl/parrot/blib/lib/libparrot.so: warning: strcat() is almost always misused, please use strlcat() /home/smallm/src/external/devel/perl/parrot/blib/lib/libparrot.so: undefined reference to `Parrot_ppc_jit_restore_nonvolatile_registers' gmake: *** [miniparrot] Error 1
src/jit/ppc/asm.s has that function name with a leading underscore. So I reverted the earlier change I mentioned to openbsd.pm and copied src/jit/ppc/ppc-linux.s to src/jit/ppc/ppc-openbsd.s as the patch to parrot in the openbsd ports tree does. That file has the function name without the underscore and doesn't use register names, which seems to be the two things it needs to keep openbsd/ppc happy. Reconfiguring and building with that file in place and the patch to src/exec_save.c parrot builds and gmake test has all tests pass.