I just printed the kernel base address and it's zero.

Needless to says that adapting the version script to work fine on the whole
kernel is not and easy task either.

On Thu, Oct 27, 2016 at 7:05 PM, Benoît Canet <[email protected]>
wrote:

>
> I think the kernel elf is a address 0
>
> On Thu, Oct 27, 2016 at 4:20 PM, Nadav Har'El <[email protected]> wrote:
>
>>
>> On Thu, Oct 27, 2016 at 3:06 PM, Benoît Canet <
>> [email protected]> 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), 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.

Reply via email to