FreeBSD Bug in header dateien

h0sch1

Well-Known Member
Hi @ll

Hab versucht eine Software zu kompalieren.
Unter Linux kein Problem unter FreeBSD 4.10 + 5.3 Beta7 folgendes Problem:

Code:
gcc -m486 -s -I/usr/local/include -I/usr/include -O2 -fomit-frame-pointer -fstrength-reduce -ffast-math -Wall -Winline -Wpointer-arith -Wcast-qual -D_GNU_SOURCE -D_POSIX_SOURCE   -c -o decode-cgi.o decode-cgi.c
`-m486' is deprecated. Use `-march=i486' or `-mtune=i486' instead.
decode-cgi.c: In function `main':
decode-cgi.c:144: warning: implicit declaration of function `strcasecmp'
decode-cgi.c:176: warning: implicit declaration of function `alloca'
decode-cgi.c:206: error: `environ' undeclared (first use in this function)
decode-cgi.c:206: error: (Each undeclared identifier is reported only once
decode-cgi.c:206: error: for each function it appears in.)
decode-cgi.c: In function `process_arguments':
decode-cgi.c:321: warning: implicit declaration of function `putenv'
gmake: *** [decode-cgi.o] Fehler 1

In der Datei decode-cgi.c wird aber die unistd.h miteingefügt und
eigentlich sollte hier doch auch "environ" vorhanden sein.

Nun hab ich einmal aus der unistd.h unter Linux die Zeile kopiert und in die config.h von dem Progi aufgenommen und siehe da es funktionierte.

Code:
gcc -m486 -s -I/usr/local/include -I/usr/include -O2 -fomit-frame-pointer -fstrength-reduce -ffast-math -Wall -Winline -Wpointer-arith -Wcast-qual -D_GNU_SOURCE -D_POSIX_SOURCE -D_FREEBSD_   -c -o decode-cgi.o decode-cgi.c
`-m486' is deprecated. Use `-march=i486' or `-mtune=i486' instead.
decode-cgi.c: In function `main':
decode-cgi.c:144: warning: implicit declaration of function `strcasecmp'
decode-cgi.c:176: warning: implicit declaration of function `alloca'
decode-cgi.c: In function `process_arguments':
decode-cgi.c:321: warning: implicit declaration of function `putenv'
decode-cgi.c: In function `main':
decode-cgi.c:80: warning: 'data' might be used uninitialized in this function
decode-cgi.c:83: warning: 'on_stack' might be used uninitialized in this function
gcc -m486 -s -o decode-cgi decode-cgi.o


Das _FREEBSD_ ist dann der "Workaround"!

Code:
#if _FREEBSD_
extern char **environ;
#endif

Nun meine Frage ist das jetzt ein Bug oder ist das normal?
 
Zuletzt bearbeitet:
keine ahnung, aber in der unistd.h gibt es environ nicht, allerdings in der roken.h, wofuer die auch immer gut sein soll ...
 
Hier bei "man environ" steht:

Code:
An array of strings called the environment is made available by execve(2)
when a process begins.

Also mal "man execve" aufrufen und hier steht drin:

Code:
NAME
     execve -- execute a file

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <unistd.h>

     int
     execve(const char *path, char *const argv[], char *const envp[]);

DESCRIPTION
     The execve() system call transforms the calling process into a new
     process.  The new process is constructed from an ordinary file, whose
     name is pointed to by path, called the new process file.  This file is
     either an executable object file, or a file of data for an interpreter.
     An executable object file consists of an identifying header, followed by
     pages of data representing the initial program (text) and initialized
     data pages.  Additional pages may be specified by the header to be ini-
     tialized with zero data; see elf(5) and a.out(5).

Also sollte es doch in der unistd.h drin stehn bzw. eine andere Header Datei mitbringen, die aber von der unistd.h mit included wird.
 
Hallo h0sch1,

poste doch mal die Zeilen, in denen "#include" steht bzw. poste decode-cgi.c als attachment, dann kann ich nachsehen.

Viele Grüße

Jürgen
 
Hallo h0sch1,

sooooo, ich habe da mal reingesehen.
Haha, Du mußt gmake verwenden! Dann klappt es :p
Wäre nett, wenn das irgendwo vermerkt wäre...


Viele Grüße

Jürgen
 
@juedan

ja sicher mit "gmake"
aber hast du es mal ohne den "Workaround" von mir probiert?
Probier doch mal die linux version zu kompalieren, bei der ist der Workaround von mir nicht drin.
 
h0sch1 schrieb:
@juedan

ja sicher mit "gmake"
aber hast du es mal ohne den "Workaround" von mir probiert?
Probier doch mal die linux version zu kompalieren, bei der ist der Workaround von mir nicht drin.


Hmmm, dat geht nit.

Viel bemerkenswerter finde ich aber etwas ganz anderes: Es läßt sich garnicht kompilieren, weder mit gmake noch mit make.
Die angemeckerten Funktionen sind definitiv in den ausgewählten header-files enthalten. Das mit dem char **environment kann man noch als Nachlässigkeit abtun, aber die anderen Funktionen...

Ich werde mir das morgen in der S-Bahn mal genauer ansehen.

Schon interessant
 
@juedan

Jo danke.

Dann bist du ja im grunde auf das gleiche gestoßen wie ich.

Normal müsste sich das Programm ohne Probleme kompalieren lassen, da es POSIX konform ist, zumindest hat mir das der Programmierer versichert.
 
Zurück
Oben