Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Undefined symbols in .so after compiling despite supplying libs

Attempting to compile .so from hidapi's linux/hid.c but not very experienced with tasks of this nature. Shared lib has undefined symbols but I don't know why they are being left undefined.

Using said .so from my program gets straightforward error:

symbol lookup error: libhid.so: undefined symbol: udev_new

Using a modified version of hidapi's linux makefile:

all: hidtest

CC       ?= gcc
CFLAGS   ?= -Wall -fPIC -c -g

CXX      ?= g++
CXXFLAGS ?= -Wall -fPIC -g

COBJS     = hid.o
CPPOBJS   = ../hidtest/hidtest.o
OBJS      = $(COBJS) $(CPPOBJS)
LIBS      = `pkg-config libudev --libs`
INCLUDES ?= -I../hidapi `pkg-config libudev --cflags`


hidtest: $(OBJS)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ $(LIBS) -o hidtest

$(COBJS): %.o: %.c
    $(CC) $(CFLAGS) -c $(INCLUDES) $< -o $@

$(CPPOBJS): %.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $(INCLUDES) $< -o $@

clean:
    rm -f $(OBJS) hidtest

.PHONY: clean

...which is then built to .so:

gcc -shared pkg-config libudev --libs -o libhid.so hid.o

... my pkg-config output is:

$ pkg-config libudev --libs
-ludev -lrt

Confirming the undefined symbols:

nm libhid.so | grep udev

000000000000181f t copy_udev_string

             U udev_device_get_devnode
             U udev_device_get_parent_with_subsystem_devtype
             U udev_device_get_sysattr_value
             U udev_device_new_from_devnum
             U udev_device_new_from_syspath
             U udev_device_unref
             U udev_enumerate_add_match_subsystem
             U udev_enumerate_get_list_entry
             U udev_enumerate_new
             U udev_enumerate_scan_devices
             U udev_enumerate_unref
             U udev_list_entry_get_name
             U udev_list_entry_get_next
             U udev_new
             U udev_unref

And udev deps don't show up in the .so:

$ldd libhid.so   
linux-vdso.so.1 => (0x00007ffffcffe000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc9d03a3000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc9d099e000)

Thank you

like image 294
user515655 Avatar asked Nov 18 '25 20:11

user515655


1 Answers

Got it: With gcc the library list must be immediately following the object being linked. From this the reordering of:

gcc -shared `pkg-config libudev --libs` -o libhid.so hid.o

to:

gcc -shared -o libhid.so hid.o `pkg-config libudev --libs`

...now results in properly functioning lib. This was derived from the following answer which was to an unrelated question but still applied to this question:

https://stackoverflow.com/a/10456630/515655

like image 179
user515655 Avatar answered Nov 21 '25 08:11

user515655



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!