socket programming on ViperLite

Guest #1385630
Hi All,
Sorry in advance if this is not the relevant forum
I'm developing on a Eurotech ViperLite board
Processor : Intel Xscale PXA255
Corss Compiler Toolchain : arm-elf-gcc-3.4.4
Host : Ubuntu 9.04

I'm trying to make a socket programming appilcation
and so far, havent managed to build it
Compile and Link command:
arm-elf-gcc -I/usr/include -o showip showip.c -L/usr/lib -lgcc -lc
Errors:
 incompatible /usr/lib/libc.a when searching for -lc
/tmp/ccysaoud.o(.text+0x84): In function `main':
: undefined reference to `getaddrinfo'
/tmp/ccysaoud.o(.text+0xa0): In function `main':
: undefined reference to `gai_strerror'
/tmp/ccysaoud.o(.text+0x140): In function `main':
: undefined reference to `inet_ntop'
/tmp/ccysaoud.o(.text+0x184): In function `main':
: undefined reference to `freeaddrinfo'
/tmp/ccysaoud.o(.text+0x19c): In function `main':
: undefined reference to `stderr'

I think its because I'm not linking in the libraries
for network programming, but I've tried -L/usr/lib, -L/lib
and -L/usr/local/lib.
Any other path for the libraries? or anything else I'm missing,

Ajay
#1386824
I don't know your system, but in similiar cases I use a handmade
script lsexposym, which searches in some standard dirs for
a given name in libs. It works with find, nm, grep and so on.
Call it with the names you search for and it outputs the
libs which export the symbols you gave on the command line.
By default libs are searched in /usr/lib and /lib and recursively in
all sub dirs of the both.

On my system it gives:
1
klaus@a64a:~ > lsexposym getaddrinfo gai_strerror inet_ntop freeaddrinfo stderr
2
Suche nach Symbol getaddrinfo
3

4
getaddrinfo gefunden in /usr/lib/libc.a:
5
Textsegment (Code):            getaddrinfo
6

7

8
getaddrinfo gefunden in /usr/lib/libanl.a:
9
Textsegment (Code):            getaddrinfo_a
10

11

12
getaddrinfo gefunden in /usr/lib/xen/libc.a:
13
Textsegment (Code):            getaddrinfo
14

15

16
getaddrinfo gefunden in /usr/lib/xen/libanl.a:
17
Textsegment (Code):            getaddrinfo_a
18

19
Suche nach Symbol gai_strerror
20

21
gai_strerror gefunden in /usr/lib/libc.a:
22
Textsegment (Code):            gai_strerror
23

24

25
gai_strerror gefunden in /usr/lib/xen/libc.a:
26
Textsegment (Code):            gai_strerror
27

28
Suche nach Symbol inet_ntop
29

30
inet_ntop gefunden in /usr/lib/libc.a:
31
Textsegment (Code):            inet_ntop
32

33

34
inet_ntop gefunden in /usr/lib/xen/libc.a:
35
Textsegment (Code):            inet_ntop
36

37
Suche nach Symbol freeaddrinfo
38

39
freeaddrinfo gefunden in /usr/lib/libc.a:
40
Textsegment (Code):            freeaddrinfo
41

42

43
freeaddrinfo gefunden in /usr/lib/xen/libc.a:
44
Textsegment (Code):            freeaddrinfo
45

46
Suche nach Symbol stderr
47

48
stderr gefunden in /usr/lib/libcrypto.a:
49
Textsegment (Code):            OPENSSL_stderr
50

51

52
stderr gefunden in /usr/lib/libc.a:
53
Data (initialized):            _IO_2_1_stderr_
54
Data (initialized):            _IO_stderr
55
Data (initialized):            stderr
56

57

58
stderr gefunden in /usr/lib/xen/libc.a:
59
Data (initialized):            _IO_2_1_stderr_
60
Data (initialized):            _IO_stderr
61
Data (initialized):            stderr
62

63

64
stderr gefunden in /usr/lib/libdbus-1.a:
65
Textsegment (Code):            _dbus_pipe_is_stdout_or_stderr

Note:
- "Suche nach Symbol ..." means "searching for symbol ..."
- "... gefunden in ..." means "... found in ..."

I append lsexposym so you might search on your Linux if you like.
Unfortunately it is commented in german and outputs in german too,
but perhaps you might find it useful now or later.

----

My assumption is you use the wrong dirs. On your command line
you say "-L/usr/lib". This will use the libs for your running system.

For cross compiling you will have the libs to be used in the
system you compile for probably not in /usr/lib but in
something like /usr/lib/arm... or anywhere else.

If the libs for cross compiling are in a dir beneath /usr/lib
then lsexposym will find them.

If not use "lsexposym -p /some/other/dir getaddrinfo..." to
search in /some/other/dir additionally or use
"lsexposym -p - -p /some/other/dir getaddrinfo..." to search
only in /some/other/dir.
#1386827
and not to forget:
I assume you use not only the wrong dirs for searching the libs but
for searching include files as well.

 Think about "... /usr/include ..." in your command line.
#1387634
I would say that you have provided insufficient information about your 
toolchain/target. The BSD socket API is part of the GNU C library, but 
unless your target is running Linux it is unlikely that your toolchain 
is using that. In fact since you have explicitly linked libc.a, I would 
say definitely.

Most OS-less (or bare metal) GNU cross-compilers use the Newlib C 
library, which provides only the ISO C library, not POSIX or other OS 
dependent extensions. In this case you will have to provide a 
third-party networking library.

Also in most cases you do not need to explicitly link libgcc.a or 
libc.a. By doing so you force a specific version to be linked, which may 
not be appropriate. The toolchain can select library variants based on 
the target, the worst possible case is that you link the host libraries!

Clifford
Admin #1387912
@Klaus: please post long source codes as an attachment, not in the text. 
Anyway, your script probably wouldn't help Ajay, because it lists all 
the libraries on the host; he needs a library for the target system of 
his cross compiler.
#1387991
It will help to find the files; it is up to him to think about
which of the listed files are for the host system and which are for
cross compiling.

And yes, I tried to attach the file, but after sending it was not
there. So I posted it inline. No problem for me; I still have it here...

Reply

A question of your own? This thread is over 17 years old. Ask it in a thread of its own – more people read along there, and it gets answered more often and sooner.

Start a new thread

A fix, an addition or feedback on this thread? Then reply here.

Formatting
  • [c]C-Code[/c]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.