Python-2.3.4 on OSF1 V4.0?
Edmond Rusjan
edmond.rusjan at gmail.com
Sat Nov 20 20:47:50 EST 2004
Martin,
Thank you for the pointers, I appreciate. Still not out of the woods
though ...
>
> As a starting point, you need to find out what library you need to
> link in to provide these symbols. Strategies to find that out are
> 1. setsockopt(2)
man setsockopt does not mention any libraries - guess that means it's
in libc
> 2. nm /usr/lib/*.a|grep setsockopt
$ nm /usr/lib/*.a |grep setsockopt setsockopt |
setsockopt | 0000000000000000 | U |
0000000000000008
setsockopt | 0000000000000000 | U |
0000000000000008
setsockopt | 0000000000000000 | U |
0000000000000008
setsockopt | 0000000000000000 | U |
0000000000000008
__setsockopt | 0000000000000000 | U |
0000000000000008
__setsockopt | 0000000000000000 | U |
0000000000000008
/usr/lib/libc.a[setsockopt.o]:
__setsockopt | 0000000000000016 | T |
0000000000000008
setsockopt | 0000000000000016 | T |
0000000000000008
__setsockopt | 0000000000000000 | U |
0000000000000008
__setsockopt | 0000000000000000 | U |
0000000000000008
/usr/lib/libc_r.a[setsockopt.o]:
__setsockopt | 0000000000000016 | T |
0000000000000008
setsockopt | 0000000000000016 | T |
0000000000000008
setsockopt | 0000000000000000 | U |
0000000000000008
setsockopt | 0000000000000000 | U |
0000000000000008
man nm says T means external text, so if I am reading correctly this
confirms setsockopt is in libc
> 3. try -lsocket
$ find /usr -name libsocket.a
$ find /usr -name libsocket.so
Also,
$ c++ -pthread -o python Modules/python.o libpython2.3.a -lsocket -lrt
-lm
/usr/bin/ld:
Can't locate file for: -lsocket
collect2: ld returned 1 exit status
On Sun, yes, it uses -lsocket and configure script figures that out.
Here's my little test program:
/*
* to help build python
* gcc -o s s.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
int ss, s, clilen, n, i;
struct sockaddr_in cli_addr, serv_addr;
char buf[512];
if ( (ss = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
perror("can't open socket");
exit(-1);
}
memset( &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(12345);
if ( bind( ss, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) <
0 )
{
perror("can't bind to port\n");
exit(-1);
}
listen(ss, 2);
clilen = sizeof(cli_addr);
s = accept( ss, (struct sockaddr *) &cli_addr, &clilen);
if (s < 0)
{
perror("server accept error");
}
for ( i=1; ; i++)
{
memset( buf, 0, 512);
if ( (n=read(s, buf, 512)) == 0) break;
printf("%d th message: %s; length: %d \n", i, buf, n);
}
close(s);
(void) printf("Hello socket!\n");
exit(0);
}
Compiles and runs ... never have to specify any library to make socket
work:
$ gcc -o s s.c]$ ./s &
[1] 12491
$ netstat -a |grep 12345
tcp 0 0 *.12345 *.*
LISTEN
$ telnet 12345
Trying 0.0.48.57...
Perhaps comparing the succesful OSF1 V5.1 and failed OSF1 V4.0 buils
may help:
[V5.1]$ ./configure |grep socket
checking sys/socket.h usability... yes
checking sys/socket.h presence... yes
checking for sys/socket.h... yes
checking for socket in -lsocket... no
[V5.1]$ make |grep socket
building '_socket' extension
gcc -pthread -DNDEBUG -g -O3 -Wall -Wstrict-prototypes
-fno-strict-aliasing -I.
-I/dat0/ajb/app/edmond/src/buildSandbox/Python-2.3.4/./Include
-I/usr/local/include
-I/dat0/ajb/app/edmond/src/buildSandbox/Python-2.3.4/Include
-I/dat0/ajb/app/edmond/src/buildSandbox/Python-2.3.4 -c
/dat0/ajb/app/edmond/src/buildSandbox/Python-2.3.4/Modules/socketmodule.c
-o build/temp.osf1-V5.1-alpha-2.3/socketmodule.o
ld -shared -expect_unresolved *
build/temp.osf1-V5.1-alpha-2.3/socketmodule.o -L/usr/local/lib -o
build/lib.osf1-V5.1-alpha-2.3/_socket.so
[V5.1]$ find . -name _socket.so
./build/lib.osf1-V5.1-alpha-2.3/_socket.so
[V5.1]$ nm build/lib.osf1-V5.1-alpha-2.3/_socket.so |grep setsockopt
setsockopt | 0000000000000000 | U |
0000000000000000
setsockopt_doc | 0004398043894268 | d |
0000000000000000
setsockopt_doc:S1006=ar56;000000000000000000000000;000000000000000000000232;2
| 0004398043894268 | d | 0000000000000001
sock_setsockopt | 0004396970424912 | t |
0000000000000008
sock_setsockopt:f267 | 0004396970424912 | t |
0000000000000008
[V4.0]$ ./configure |grep socket
checking sys/socket.h usability... yes
checking sys/socket.h presence... yes
checking for sys/socket.h... yes
checking for socket in -lsocket... no
[V4.0]$ make |grep socket
building '_socket' extension
gcc -pthread -DNDEBUG -g -O3 -Wall -Wstrict-prototypes
-fno-strict-aliasing -I.
-I/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/./Include
-I/usr/local/include
-I/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Include
-I/u101/ajbddg/edmond/src/sandbox/Python-2.3.4 -c
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c -o
build/temp.osf1-V4.0-alpha-2.3/socketmodule.o
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:
In function `sock_accept':
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:1137:
warning: passing arg 3 of `accept' from incompatible pointer type
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:
In function `sock_getsockopt':
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:1361:
warning: passing arg 5 of `getsockopt' from incompatible pointer type
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:1379:
warning: passing arg 5 of `getsockopt' from incompatible pointer type
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:
In function `sock_getsockname':
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:1623:
warning: passing arg 3 of `getsockname' from incompatible pointer type
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:
In function `sock_getpeername':
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:1651:
warning: passing arg 3 of `getpeername' from incompatible pointer type
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:
In function `sock_recvfrom':
/u101/ajbddg/edmond/src/sandbox/Python-2.3.4/Modules/socketmodule.c:1898:
warning: passing arg 6 of `recvfrom' from incompatible pointer type
ld -shared -expect_unresolved *
build/temp.osf1-V4.0-alpha-2.3/socketmodule.o -L/usr/local/lib -o
build/lib.osf1-V4.0-alpha-2.3/_socket.so
*** WARNING: renaming "_socket" since importing it failed: Unresolved
symbol in build/lib.osf1-V4.0-alpha-2.3/_socket.so: _Esetsockopt
[V4.0]$ find . -name '_socket*'
./PCbuild/_socket.dsp
./build/lib.osf1-V4.0-alpha-2.3/_socket_failed.so
[V4.0]$ nm build/lib.osf1-V4.0-alpha-2.3/_socket_failed.so |grep
setsockopt
_Esetsockopt | 0000000000000000 | U |
0000000000000000
setsockopt_doc | 0004398043893924 | d |
0000000000000000
setsockopt_doc:S794=ar55;000000000000000000000000;000000000000000000000232;2
| 0004398043893924 | d | 0000000000000008
sock_setsockopt | 0004396970422608 | t |
0000000000000008
sock_setsockopt:f238 | 0004396970422608 | t |
0000000000000008
I don't understand if the '_E' in '_Esetsockopt' is significant and/or
where it comes from, but that's one difference that strikes me.
[V4.0]$ grep setsockopt Modules/socketmodule.c|wc
11 39 498
[V4.0]$ grep _Esetsockopt Modules/socketmodule.c|wc
0 0 0
Thank you in advance for your help.
Edmond
More information about the Python-list
mailing list