From: Albert ARIBAUD (U-Boot) <albert.u.boot@aribaud.net>
To: u-boot@lists.denx.de
Subject: [U-Boot] Function prototype conflicts with standalone apps
Date: Wed, 16 Jan 2013 08:25:49 +0100 [thread overview]
Message-ID: <20130116082549.4babe813@lilith> (raw)
In-Reply-To: <CAFOYHZBRZHH-g1Us5CcUTwj9wi+giw9RPnZ6SV+cY4jVy=p-5w@mail.gmail.com>
Hi Chris,
On Wed, 16 Jan 2013 17:23:58 +1300, Chris Packham
<judge.packham@gmail.com> wrote:
> Hi,
>
> I've just run into something porting an existing out of tree board to
> u-boot 2012.10 but I think it points to a generic issue for standalone
> applications.
>
> Consider the following change
>
> diff --git a/examples/standalone/hello_world.c
> b/examples/standalone/hello_world.c
> index 067c390..d2e6a77 100644
> --- a/examples/standalone/hello_world.c
> +++ b/examples/standalone/hello_world.c
> @@ -24,7 +24,7 @@
> #include <common.h>
> #include <exports.h>
>
> -int hello_world (int argc, char * const argv[])
> +int net_init (int argc, char * const argv[])
> {
> int i;
>
> Because I'm not linking with the u-boot object file, I should be able to
> use any function name I like in my application as long as it isn't one of
> the functions in exports.h (at least in theory). Unfortunately I end up
> with the following compiler error
>
> hello_world.c:27: error: conflicting types for ?net_init?
> uboot/include/net.h:489: error: previous declaration of ?net_init? was
> here
> make[1]: *** [hello_world.o] Error 1
>
> If I replace #include <common.h> in my app with the first hunk of includes
> from the top of common.h then I can compile just fine.
>
> I was wondering if it made sense to people to have standalone applications
> define something like __STANDALONE__ either via CPPFLAGS or in the source
> itself and use the presence of that to exclude the majority of common.h
> when used in standalone applications. Or alternatively move the required
> bits to exports.h.
(long rant ahead. Short answer after end of rant)
[RANT]
Code writers indeed have a right to name any function or other object
any way they choose... within the constraints of the situation.
Some of these constraints stem from the tools -- you just cannot put an
ampersand in a C object name, for instance -- and some stem from the
'agreement' entered into when using a library -- precisely, the
agreement on the name and semantics of such and such object names.
Here, by including exports.h, you enter an agreement in which
the object name 'net_init' receives a specific meaning. What you want
is to benefit from the agreement without abiding by it.
Now this can be changed, technically, as most things are, and a new
kind of agreement could be devised with fine-grain control on which
object names would or would not be defined. The question is, *should*
this be done?
Would you, analogously, suggest that Linux app developers be able to
opt out of defining fopen() when they #include <stdio.h> because they
feel they have a right to define 'char* fopen(float F)' in their code if
they so please? And that it should be done so for just about any
kernel-exported symbol? I suspect not.
So why ask this from U-Boot?
[/RANT]
I personally will NAK such a suggestion. I don't see the point in
adding complexity just to solve a naming conflict between a framework,
de facto standard, name and a freely-modifiable application name. Just
rename the application function -- that'll be all the better since that
will also remove potential misunderstanding for readers of your code.
> Thanks,
> Chris
Amicalement,
--
Albert.
next prev parent reply other threads:[~2013-01-16 7:25 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-16 4:23 [U-Boot] Function prototype conflicts with standalone apps Chris Packham
2013-01-16 4:41 ` Chris Packham
2013-01-16 7:25 ` Albert ARIBAUD [this message]
2013-01-16 7:28 ` Albert ARIBAUD
2013-01-16 10:16 ` Chris Packham
2013-01-16 12:57 ` Albert ARIBAUD
2013-01-16 20:01 ` Chris Packham
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130116082549.4babe813@lilith \
--to=albert.u.boot@aribaud.net \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.