> -----Original Message-----
> From: Qais Yousef
> Sent: 18 July 2012 10:20
> To: 'Bernhard Reutner-Fischer'
> Subject: RE: open() return value
>
> > As said, a small, self-contained testcase that exhibits the bug would
> > help, please follow-up on the mailing-list with something we can try to
> reproduce..
> >
> > I'm curious which port that is? :)
> >
> > TIA && cheers,
> The attached c file fails for me. The first 2 open() return -1 and errno is
> 2, the 2nd
> set of open() after pthread is created return -2 and errno is 2. I think the
> errno
> stays 2 because it remembered it rather than being set correctly. When I use
> linuxthreads return value is always -1 (in the couple of test cases I have at
> least).
>
> I am not terminating the thread correctly because I was just lazy to code it
> :p.
> Shouldn't make a difference except for better code quality. Please let me
> know if
> you could reproduce the problem.
>
> The port is for Meta processor :)
>
> Thanks,
> Qais
OK, I might understand what's going on but not really how. I managed to get it
working by a combination of hacks:
a) in fctnl.h make sure we use the definition of open() in '#ifdef
__REDIRECT' block
b) remove all reference to open.S in NPTL
sysdeps/unix/*/Makefile.commonarch
c) set __libc_open and open as strong alisases to open64 in
libc/*/open64.c
e) recompile my test case (because of the change in the header file)
I might be able to minimise this, but I found this combination to work. NPTL
seems to pull another definition of __libc_open() which is not right. Looking
at the disassembly of libc.so I have no reference to __libc_open after my above
modifications and all reference use open64. Before the modifications part of
the code uses open64 and other uses __libc_open which causes the wrong
behaviour. NPTL pulls the definition of this function somehow - I think, it's
all magic to me still. Is it a compiler bug? Or a build system bug? Or
something else? Hmmmmm
How should _FILE_OFFSET_BITS be set? I was surprised that I had to do the
modification in (a).
Qais
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
void *dummy1(void *data)
{
while (1) {
fprintf(stderr, "#1: hurray, another loop :)\n");
sleep(1);
}
return NULL;
}
int main (int argc, char *argv[])
{
int infd;
pthread_t t1;
infd = open("haha_don't_exist", O_WRONLY);
fprintf(stderr, "infd = %d, errno = %d\n", infd, errno);
perror("open");
infd = open("haha_don't_exist", O_WRONLY);
fprintf(stderr, "infd = %d, errno = %d\n", infd, errno);
perror("open");
pthread_create(&t1, NULL, dummy1, NULL);
infd = open("haha_don't_exist", O_WRONLY);
fprintf(stderr, "infd = %d, errno = %d\n", infd, errno);
perror("open");
infd = open("haha_don't_exist", O_WRONLY);
fprintf(stderr, "infd = %d, errno = %d\n", infd, errno);
perror("open");
return 0;
}
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc