On Thu, Oct 27, 2016 at 5:20 PM, Nadav Har'El <[email protected]> wrote:
> > On Thu, Oct 27, 2016 at 3:06 PM, Benoît Canet <benoit.canet.contrib@gmail. > com> wrote: > >> Go use this on linux to lookup time. We need a shared >> libary that we will expose to the go runtime by passing >> it's pointer via auxv in order for go to resolve this >> kinds of symbols. >> >> We cannot pass the kernel library as vdso because it's >> located at address 0 and Go runtime will guard against >> this. >> > > I still don't understand that last comment - what is located at address 0? > I believe that in the same way we represent any shared object, we also > have a representation (program::_core points to it), > More accurately, it seems you're passing the object's _base address in auxv. _core always has a _base of ELF_IMAGE_START, unless I'm misunderstanding something. And that's not 0 (it defaults to 0x200000, set in the Makefile in kernel_base). so I don't yet understand why it's not possible to do it that way. Maybe > there are other problems preventing this from working, but I didn't > understand the "address 0" issue. > > >> >> Signed-off-by: Benoît Canet <[email protected]> >> --- >> Makefile | 7 ++++++- >> bootfs.manifest.skel | 1 + >> libc/vdso/vdso.c | 18 ++++++++++++++++++ >> libc/vdso/vdso.version | 3 +++ >> usr.manifest.skel | 1 + >> usr_nozfs.manifest.skel | 1 + >> 6 files changed, 30 insertions(+), 1 deletion(-) >> create mode 100644 libc/vdso/vdso.c >> create mode 100644 libc/vdso/vdso.version >> >> diff --git a/Makefile b/Makefile >> index e294a03..5327708 100644 >> --- a/Makefile >> +++ b/Makefile >> @@ -1836,6 +1836,11 @@ $(out)/libenviron.so: $(environ_sources) >> $(makedir) >> $(call quiet, $(CC) $(CFLAGS) -shared -o $(out)/libenviron.so >> $(environ_sources), CC libenviron.so) >> >> +$(out)/libvdso.so: libc/vdso/vdso.c libc/vdso/vdso.ld >> > > If I understand correctly (?), you don't have vdso.ld any more, so it > shouldn't be on the dependency list. Maybe you meant vdso.version? > I wonder how this didn't fail to build because vdso.ld is missing? > > >> + $(makedir) >> + $(call quiet, $(CC) -c -fPIC -o $(out)/libvdso.o >> libc/vdso/vdso.c, CC libvdso.o) >> + $(call quiet, $(LD) -shared -fPIC -o $(out)/libvdso.so >> $(out)/libvdso.o --version-script=libc/vdso/vdso.version, LINK >> libvdso.so) >> + >> bootfs_manifest ?= bootfs.manifest.skel >> >> # If parameter "bootfs_manifest" has been changed since the last make, >> @@ -1848,7 +1853,7 @@ $(bootfs_manifest_dep): phony >> fi >> >> $(out)/bootfs.bin: scripts/mkbootfs.py $(bootfs_manifest) >> $(bootfs_manifest_dep) $(tools:%=$(out)/%) \ >> - $(out)/zpool.so $(out)/zfs.so $(out)/libenviron.so >> + $(out)/zpool.so $(out)/zfs.so $(out)/libenviron.so >> $(out)/libvdso.so >> $(call quiet, olddir=`pwd`; cd $(out); >> $$olddir/scripts/mkbootfs.py -o bootfs.bin -d bootfs.bin.d -m >> $$olddir/$(bootfs_manifest) \ >> -D jdkbase=$(jdkbase) -D gccbase=$(gccbase) -D \ >> glibcbase=$(glibcbase) -D miscbase=$(miscbase), MKBOOTFS >> $@) >> diff --git a/bootfs.manifest.skel b/bootfs.manifest.skel >> index 9816e92..41d48b4 100644 >> --- a/bootfs.manifest.skel >> +++ b/bootfs.manifest.skel >> @@ -1,4 +1,5 @@ >> [manifest] >> +/libvdso.so: libvdso.so >> /libuutil.so: libuutil.so >> /zpool.so: zpool.so >> /libzfs.so: libzfs.so >> diff --git a/libc/vdso/vdso.c b/libc/vdso/vdso.c >> new file mode 100644 >> index 0000000..9212321 >> --- /dev/null >> +++ b/libc/vdso/vdso.c >> @@ -0,0 +1,18 @@ >> +//#include "libc.h" >> +#include <time.h> >> +#include <sys/time.h> >> + >> +time_t __vdso_time(time_t *tloc) >> +{ >> + return time(tloc); >> +} >> + >> +int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz) >> +{ >> + return gettimeofday(tv, tz); >> +} >> + >> +int __vdso_clock_gettime(clockid_t clk_id, struct timespec *tp) >> +{ >> + return clock_gettime(clk_id, tp); >> +} >> diff --git a/libc/vdso/vdso.version b/libc/vdso/vdso.version >> new file mode 100644 >> index 0000000..a98ad1a >> --- /dev/null >> +++ b/libc/vdso/vdso.version >> @@ -0,0 +1,3 @@ >> +LINUX_2.6 { >> +global: *; >> +}; >> diff --git a/usr.manifest.skel b/usr.manifest.skel >> index 583bdfe..159b73d 100644 >> --- a/usr.manifest.skel >> +++ b/usr.manifest.skel >> @@ -1,5 +1,6 @@ >> [manifest] >> /libenviron.so: libenviron.so >> +/libvdso.so: libvdso.so >> /zpool.so: zpool.so >> /libzfs.so: libzfs.so >> /libuutil.so: libuutil.so >> diff --git a/usr_nozfs.manifest.skel b/usr_nozfs.manifest.skel >> index a7d4731..ce051af 100644 >> --- a/usr_nozfs.manifest.skel >> +++ b/usr_nozfs.manifest.skel >> @@ -1,5 +1,6 @@ >> [manifest] >> /libenviron.so: libenviron.so >> +/libvdso.so: libvdso.so >> /tools/mount-nfs.so: tools/mount/mount-nfs.so >> /tools/umount.so: tools/mount/umount.so >> /usr/lib/libgcc_s.so.1: %(gccbase)s/lib64/libgcc_s.so.1 >> -- >> 2.7.4 >> >> -- >> You received this message because you are subscribed to the Google Groups >> "OSv Development" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
