Ferenc Wagner, le Mon 27 Apr 2009 22:29:02 +0200, a écrit :
> Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> writes:
> > Ferenc Wagner, le Mon 27 Apr 2009 21:42:42 +0200, a écrit :
> >
> >> Of course if I add -lncurses to the above command, I get lots of
> >> undefined references to the libc functions from ncurses.
> >
> > Which ones?
>
> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./base/lib_color.c:265:
> undefined reference to `calloc'
> etc.
>
> No wonder, as the linker command originally had a single object
> (mini-os.o), and if I put -lncurses before it, it wasn't pulled in,
> and if I put -lncurses after it, then every single libc function
> became undefined.
Have you, like in the C example of stubdom/Makefile, propagated
TARGET_CPPFLAGS, TARGET_CFLAGS, and added a rule like is done for other
stubdom images in the "minios" paragraph of stubdom/Makefile?
> Yes, but I tried the crazy way first, which was bound to fail. Setting
>
> LDLIBS := -L/home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/lib -lncurses
That's not how it's supposed to be done. See the Cross-zlib paragraph
for instance: the cross-zlib target not only configures & builds libz,
but also installs it, the prefix being properly set during configuration
into the cross-chain directory.
> I couldn't track how it's done for libpci & libz for qemu-stubdom
> (ioemu?) yet.
It's all in stubdom/Makefile: they get installed within the
cross-root-$(GNU_TARGET_ARCH) hierarchy, where the linker finds it
thanks to the TARGET_LDFLAGS variable.
> This make magic is somewhat convoluted,
It's no magic, it's makefiles :)
> and I'm not too much into linker scripts et al.
You do not need to change any linker script.
> So, where should I add it for proper operation?
Just the same way as zlib & C stubdom examples.
> /home/wferi/xen/xen-3.3.1/stubdom/mini-os-x86_32-c/mini-os.o: In function
> `grub_memalign':
> /home/wferi/xen/grub2/util/misc.c:263: undefined reference to `posix_memalign'
It should just be a matter of setting it as an alias for newlib's
memalign, by adding a macro into newlib/libc/include/malloc.h for
instance. Ideally it should be reported to newlib's upstream actually.
> /home/wferi/xen/grub2/util/getroot.c:215: undefined reference to `lstat'
> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tty/lib_tstp.c:159:
> undefined reference to `tcgetpgrp'
> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tty/lib_tstp.c:159:
> undefined reference to `getpgrp'
> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tinfo/lib_kernel.c:143:
> undefined reference to `tcflush'
Should be fixed by the patch below.
> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tinfo/lib_baudrate.c:244:
> undefined reference to `cfgetospeed'
I'm a bit surprised you actually got code using cfgetospeed compiled in
the miniOS environment. It's supposed to return something like B9600,
but that's not defined by newlib!
> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tinfo/lib_kernel.c:67:
> undefined reference to `fpathconf'
Same issue: how did you get that code to compile? _PC_VDISABLE is not
defined... I believe you are not using the cross-chain flags.
> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tinfo/access.c:112:
> undefined reference to `access'
> /home/wferi/xen/xen-3.3.1/stubdom/ncurses-x86_32/ncurses/../ncurses/./tinfo/access.c:125:
> undefined reference to `access'
Mmmm, the fsif protocol does not provide an access operation to
implement that properly. You could add a dummy implementation in
lib/sys.c that just open()/close() it and return proper error codes if
any and it should be fine for ncurses' use cases.
Samuel
Add tcgetpgrp getpgrp tcflush and lstat dummy implementations.
Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
diff -r 9fdcd3ab84b7 extras/mini-os/lib/sys.c
--- a/extras/mini-os/lib/sys.c Mon Apr 27 15:40:09 2009 +0100
+++ b/extras/mini-os/lib/sys.c Mon Apr 27 23:05:01 2009 +0200
@@ -148,6 +148,16 @@
return 1;
}
+pid_t tcgetpgrp(int fd)
+{
+ return 1;
+}
+
+pid_t getpgrp(void)
+{
+ return 1;
+}
+
char *getcwd(char *buf, size_t size)
{
snprintf(buf, size, "/");
@@ -365,6 +375,20 @@
return -1;
}
+int tcflush(int fd, int queue_selector)
+{
+ switch (files[fd].type) {
+ case FTYPE_CONSOLE:
+ /* Already flushed */
+ return 0;
+ default:
+ break;
+ }
+ printk("tcflush(%d): Bad descriptor\n", fd);
+ errno = EBADF;
+ return -1;
+}
+
int close(int fd)
{
printk("close(%d)\n", fd);
@@ -473,6 +497,8 @@
out:
return ret;
}
+/* We do not have symlinks */
+int lstat(const char *path, struct stat *buf) __attribute__((alias("stat")));
int fstat(int fd, struct stat *buf)
{
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|