1

I've compiled Wireshark into LLVM then I proceeded to link against some libraries which I also compiled into LLVM.

The libraries I linked were libwsutil, libz and libpcap. However KLEE still gives me a warning for undefined function for libpcap.

I compiled libpcap by using these flags:

CC="llvm-gcc" CFLAGS="-flto -c" AR="llvm-ar" LD="llvm-ld"

These flags worked for the other libraries too.

What could be the cause?

KLEE: WARNING ONCE: function "capture_loop_dispatch" has inline asm
KLEE: WARNING ONCE: function "__user_main" has inline asm
KLEE: WARNING: undefined reference to function: __ctype_b_loc
KLEE: WARNING: undefined reference to function: __xstat64
KLEE: WARNING: undefined reference to function: bpf_image
KLEE: WARNING: undefined reference to function: cap_free
KLEE: WARNING: undefined reference to function: cap_init
KLEE: WARNING: undefined reference to function: cap_set_flag
KLEE: WARNING: undefined reference to function: cap_set_proc
...
...
KLEE: WARNING: undefined reference to function: lseek64
KLEE: WARNING: undefined reference to function: pcap_activate
KLEE: WARNING: undefined reference to function: pcap_breakloop
KLEE: WARNING: undefined reference to function: pcap_can_set_rfmon
KLEE: WARNING: undefined reference to function: pcap_close
KLEE: WARNING: undefined reference to function: pcap_compile
KLEE: WARNING: undefined reference to function: pcap_create
KLEE: WARNING: undefined reference to function: pcap_datalink
KLEE: WARNING: undefined reference to function: pcap_datalink_name_to_val
KLEE: WARNING: undefined reference to function: pcap_datalink_val_to_description
KLEE: WARNING: undefined reference to function: pcap_datalink_val_to_name
KLEE: WARNING: undefined reference to function: pcap_dispatch
KLEE: WARNING: undefined reference to function: pcap_findalldevs
KLEE: WARNING: undefined reference to function: pcap_free_datalinks
KLEE: WARNING: undefined reference to function: pcap_freealldevs
KLEE: WARNING: undefined reference to function: pcap_freecode
KLEE: WARNING: undefined reference to function: pcap_get_selectable_fd
KLEE: WARNING: undefined reference to function: pcap_geterr
KLEE: WARNING: undefined reference to function: pcap_lib_version
KLEE: WARNING: undefined reference to function: pcap_list_datalinks
KLEE: WARNING: undefined reference to function: pcap_lookupnet
KLEE: WARNING: undefined reference to function: pcap_open_live
KLEE: WARNING: undefined reference to function: pcap_set_buffer_size
KLEE: WARNING: undefined reference to function: pcap_set_datalink
KLEE: WARNING: undefined reference to function: pcap_set_promisc
KLEE: WARNING: undefined reference to function: pcap_set_rfmon
KLEE: WARNING: undefined reference to function: pcap_set_snaplen
KLEE: WARNING: undefined reference to function: pcap_set_timeout
KLEE: WARNING: undefined reference to function: pcap_setfilter
KLEE: WARNING: undefined reference to function: pcap_snapshot
KLEE: WARNING: undefined reference to function: pcap_stats
KLEE: WARNING: undefined reference to function: pcap_statustostr
KLEE: WARNING: undefined reference to function: prctl
drum
  • 5,416
  • 7
  • 57
  • 91
  • Are you compiling for 32-bit or 64-bit architecture? Perhaps the signatures of missing pcap functions use 64-bit integers, like missing lseek64 does. – rr- May 11 '14 at 21:03
  • I am using a 32-bit machine to compile everything. – drum May 11 '14 at 21:05
  • This might be source of the problem. Try hinting it somehow to force it to use 32-bit variants (`-D ...` option?). You might need to look at the source code to see how to do it; searching for instructions like `#ifdef ...` might be a good start... – rr- May 11 '14 at 21:07
  • I've looked at the source code and I found `#define lseek64 lseek` so I assume there are a few line for compatibility purposes. Removing them should do the trick but does not appear to be the issue for `libpcap`. – drum May 11 '14 at 21:14

1 Answers1

3

Read the "Getting Started" of KLEE at Getting Started

By default, KLEE works on closed programs (programs that don’t use any external code such as C library functions). However, if you want to use KLEE to run real programs you will want to enable the KLEE POSIX runtime, which is built on top of the uClibc C library.

So the KLEE can not use the C library function defaultly, if you use KLEE with the option libc=uclibc, the KLEE will link the external function into your IR code, and execute the IR code

Community
  • 1
  • 1
wangxf
  • 160
  • 1
  • 11