Thread: binary operators / C func getting "invalid ELF header"

binary operators / C func getting "invalid ELF header"

From
Michael Olivier
Date:
Hi folks,

I need to do a complex bitwise operation on integers during a select
query such as:

    select acctname from users U where func(U.flags, 27) = 0;

The function in C is:

    result = (~A) & (A ^ B)

I didn't see any bitwise operations like AND and XOR in the postgres
doc -- if they're there, I apologize and would love a pointer to the
doc.

Otherwise, I've gone down the path of trying to write a C function to
do this... and am getting this error:

    db=> select not_a_and__a_xor_b(1,1);
    ERROR:  Load of file /home/michael/sql/funcs.so failed:
     ��t@��t@chael/sql/funcs.so: invalid ELF header

I'm compiling with the -fpic option for Linux (under gcc)

    cc -c -O2 -fpic -g -I. -I./include -I. -I./include  -c funcs.c -o
funcs.o
    /bin/rm -f funcs.so
    /usr/bin/ar cr funcs.so funcs.o

Can someone tell me the step(s) I'm missing or what to try next? I've
tested the C code - works fine (included below).

thanks,
--Michael


------------------------------------------------
//
// functions used within postgres
//

#include "postgres.h"            /* for char16, etc. */

int
not_a_and__a_xor_b(int A, int B)
{
    return (~A) & (A ^ B);
}

_________________________________________________________
DO YOU YAHOO!?
Get your free @yahoo.com address at http://mail.yahoo.com


Re: [SQL] binary operators / C func getting "invalid ELF header"

From
"Gene Selkov Jr."
Date:
>
> I've gone down the path of trying to write a C function to
> do this... and am getting this error:
>
>     db=3D> select not_a_and__a_xor_b(1,1);
>     ERROR:  Load of file /home/michael/sql/funcs.so failed:
>      =A8=B8t@=A8=B8t@chael/sql/funcs.so: invalid ELF header
>
> I'm compiling with the -fpic option for Linux (under gcc)
>
>     cc -c -O2 -fpic -g -I. -I./include -I. -I./include  -c funcs.c -o
> funcs.o
>     /bin/rm -f funcs.so
>     /usr/bin/ar cr funcs.so funcs.o =20

Try to adapt the Makefile from src/tutorial to your purposes. Make sure it includes the right
rules by changing

SRCDIR= ..
include ../Makefile.global

to:

SRCDIR= /path/to/your/postgres/source/tree/src
include $(SRCDIR)/Makefile.global

Then name your target files in $(DLOBJS).

You may also want to note the sed rules that substitute anchors such
as _OBJWD_ with the absolute path. They make your sql scripts more
portable (see funcs.source for example.

--Gene