1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun #include <linux/types.h> 3*4882a593Smuzhiyun #include <linux/module.h> 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* Some of this are builtin function (some are not but could in the future), 6*4882a593Smuzhiyun * so I *must* declare good prototypes for them and then EXPORT them. 7*4882a593Smuzhiyun * The kernel code uses the macro defined by include/linux/string.h, 8*4882a593Smuzhiyun * so I undef macros; the userspace code does not include that and I 9*4882a593Smuzhiyun * add an EXPORT for the glibc one. 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #undef strlen 13*4882a593Smuzhiyun #undef strstr 14*4882a593Smuzhiyun #undef memcpy 15*4882a593Smuzhiyun #undef memset 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun extern size_t strlen(const char *); 18*4882a593Smuzhiyun extern void *memmove(void *, const void *, size_t); 19*4882a593Smuzhiyun extern void *memset(void *, int, size_t); 20*4882a593Smuzhiyun extern int printf(const char *, ...); 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* If it's not defined, the export is included in lib/string.c.*/ 23*4882a593Smuzhiyun #ifdef __HAVE_ARCH_STRSTR 24*4882a593Smuzhiyun EXPORT_SYMBOL(strstr); 25*4882a593Smuzhiyun #endif 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #ifndef __x86_64__ 28*4882a593Smuzhiyun extern void *memcpy(void *, const void *, size_t); 29*4882a593Smuzhiyun EXPORT_SYMBOL(memcpy); 30*4882a593Smuzhiyun #endif 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun EXPORT_SYMBOL(memmove); 33*4882a593Smuzhiyun EXPORT_SYMBOL(memset); 34*4882a593Smuzhiyun EXPORT_SYMBOL(printf); 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* Here, instead, I can provide a fake prototype. Yes, someone cares: genksyms. 37*4882a593Smuzhiyun * However, the modules will use the CRC defined *here*, no matter if it is 38*4882a593Smuzhiyun * good; so the versions of these symbols will always match 39*4882a593Smuzhiyun */ 40*4882a593Smuzhiyun #define EXPORT_SYMBOL_PROTO(sym) \ 41*4882a593Smuzhiyun int sym(void); \ 42*4882a593Smuzhiyun EXPORT_SYMBOL(sym); 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun extern void readdir64(void) __attribute__((weak)); 45*4882a593Smuzhiyun EXPORT_SYMBOL(readdir64); 46*4882a593Smuzhiyun extern void truncate64(void) __attribute__((weak)); 47*4882a593Smuzhiyun EXPORT_SYMBOL(truncate64); 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #ifdef CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA 50*4882a593Smuzhiyun EXPORT_SYMBOL(vsyscall_ehdr); 51*4882a593Smuzhiyun EXPORT_SYMBOL(vsyscall_end); 52*4882a593Smuzhiyun #endif 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(__errno_location); 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(access); 57*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(open); 58*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(open64); 59*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(close); 60*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(read); 61*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(write); 62*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(dup2); 63*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(__xstat); 64*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(__lxstat); 65*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(__lxstat64); 66*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(__fxstat64); 67*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(lseek); 68*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(lseek64); 69*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(chown); 70*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(fchown); 71*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(truncate); 72*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(ftruncate64); 73*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(utime); 74*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(utimes); 75*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(futimes); 76*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(chmod); 77*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(fchmod); 78*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(rename); 79*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(__xmknod); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(symlink); 82*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(link); 83*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(unlink); 84*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(readlink); 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(mkdir); 87*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(rmdir); 88*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(opendir); 89*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(readdir); 90*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(closedir); 91*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(seekdir); 92*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(telldir); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(ioctl); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(pread64); 97*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(pwrite64); 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(statfs); 100*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(statfs64); 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(getuid); 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(fsync); 105*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(fdatasync); 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(lstat64); 108*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(fstat64); 109*4882a593Smuzhiyun EXPORT_SYMBOL_PROTO(mknod); 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /* Export symbols used by GCC for the stack protector. */ 112*4882a593Smuzhiyun extern void __stack_smash_handler(void *) __attribute__((weak)); 113*4882a593Smuzhiyun EXPORT_SYMBOL(__stack_smash_handler); 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun extern long __guard __attribute__((weak)); 116*4882a593Smuzhiyun EXPORT_SYMBOL(__guard); 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #ifdef _FORTIFY_SOURCE 119*4882a593Smuzhiyun extern int __sprintf_chk(char *str, int flag, size_t strlen, const char *format); 120*4882a593Smuzhiyun EXPORT_SYMBOL(__sprintf_chk); 121*4882a593Smuzhiyun #endif 122