Re: libc compile failure with new syscall.

From: Konstantin Belousov <kostikbel_at_gmail.com>
Date: Mon, 29 Jun 2015 11:43:16 +0300
On Mon, Jun 29, 2015 at 04:33:31PM +0800, Julian Elischer wrote:
> Hi all,
> 
> At $JOB we have a few extra syscalls that we have added to our kernel.
> 
> After generating the new sysent files in /sys/kern, libc fails to 
> compile with:
> 
> ===> lib/libc (obj,depend,all,install)
> building shared library libc.so.7
> [...]
> /usr/bin/ld: rlk_check_offline.So: relocation R_X86_64_32 against 
> `SYS_rlk_check_offline' can not be used when making a shared object; 
> recompile with -fPIC
> rlk_check_offline.So: could not read symbols: Bad value
> *** [libc.so.7] Error code 1
> 
> this suggests that the code that generates the libc syscall stubs is 
> generating something the linker doesn't like.
No, this suggests that the symbol SYS_rlk_check_offline was undefined
when assembling your rlk_check_offline.S.

Check the way you generated the stuff from syscalls.master.  Most likely,
sys/sys/syscall.h update was lost.

> 
> 
> the definition of the syscall is:
> 
> 588     AUE_NULL        NOSTD   { int rlk_check_offline(char *localfs, 
> char *path, \
>                                      int *is_offline, int rlk_flags, \
>                                      int *cache_status); }
> ------
> which generates (in various files):
>          { AS(rlk_check_offline_args), (sy_call_t *)lkmressys, 
> AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 588 = rlk_check_offline */
> ------
>          "rlk_check_offline",                    /* 588 = 
> rlk_check_offline */
> ------
>          /* rlk_check_offline */
>          case 588: {
>                  struct rlk_check_offline_args *p = params;
>                  uarg[0] = (intptr_t) p->localfs; /* char * */
>                  uarg[1] = (intptr_t) p->path; /* char * */
>                  uarg[2] = (intptr_t) p->is_offline; /* int * */
>                  iarg[3] = p->rlk_flags; /* int */
>                  uarg[4] = (intptr_t) p->cache_status; /* int * */
>                  *n_args = 5;
>                  break;
>          }
> -------
> #define SYS_rlk_check_offline   588
^^^^^ This must be seen by asm.

Note that in the stock sources, lib/libc/amd64/SYS.h includes syscall.h.

> -------
> struct rlk_check_offline_args {
>          char localfs_l_[PADL_(char *)]; char * localfs; char 
> localfs_r_[PADR_(char *)];
>          char path_l_[PADL_(char *)]; char * path; char 
> path_r_[PADR_(char *)];
>          char is_offline_l_[PADL_(int *)]; int * is_offline; char 
> is_offline_r_[PADR_(int *)];
>          char rlk_flags_l_[PADL_(int)]; int rlk_flags; char 
> rlk_flags_r_[PADR_(int)];
>          char cache_status_l_[PADL_(int *)]; int * cache_status; char 
> cache_status_r_[PADR_(int *)];
> };
> int     sys_rlk_check_offline(struct thread *, struct 
> rlk_check_offline_args *);
> #define SYS_AUE_rlk_check_offline       AUE_NULL
> 
> -------
> 
> 
> 
> the generated stub looks like:
> $ cat /usr/obj/usr/src/lib/libc/rlk_check_offline.S
> 
> #include "compat.h"
> #include "SYS.h"
> RSYSCALL(rlk_check_offline)
>          .section .note.GNU-stack,"",%progbits
> 
> --------
> 
> 
> nothing in this definition looks special, So I'm surprised that the 
> libc build doesn't like it.
> This is a (just) post 10.1 10-stable. But we plan to move to 11 soon too.
> 
> Any suggestions as to what I should change would be greatly 
> appreciated.. I'm running out of ideas.
> 
> 
> 
> 
> 
> 
> 
> _______________________________________________
> freebsd-current_at_freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"
Received on Mon Jun 29 2015 - 06:43:27 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:58 UTC