1*e018004aSPuranjay Mohan // SPDX-License-Identifier: GPL-2.0 2*e018004aSPuranjay Mohan /* 3*e018004aSPuranjay Mohan * Compiled twice and partially linked so the result has duplicate locals, 4*e018004aSPuranjay Mohan * which is what symid_needed() requires. dup_normal is in a live section, 5*e018004aSPuranjay Mohan * dup_discarded in one the vmlinux link throws away. DISCARDED_SEC selects 6*e018004aSPuranjay Mohan * which discarded section, since there is more than one and each was its own 7*e018004aSPuranjay Mohan * bug. 8*e018004aSPuranjay Mohan */ 9*e018004aSPuranjay Mohan 10*e018004aSPuranjay Mohan #ifndef DISCARDED_SEC 11*e018004aSPuranjay Mohan #define DISCARDED_SEC ".exitcall.exit" 12*e018004aSPuranjay Mohan #endif 13*e018004aSPuranjay Mohan 14*e018004aSPuranjay Mohan static const char __modinfo[] 15*e018004aSPuranjay Mohan __attribute__((section(".modinfo"), used, aligned(1))) = "\0name=vmlinux"; 16*e018004aSPuranjay Mohan 17*e018004aSPuranjay Mohan static int dup_normal = 1; 18*e018004aSPuranjay Mohan 19*e018004aSPuranjay Mohan static void *dup_discarded 20*e018004aSPuranjay Mohan __attribute__((section(DISCARDED_SEC), used)) = &dup_normal; 21*e018004aSPuranjay Mohan FUNC_NAME(void)22*e018004aSPuranjay Mohanint FUNC_NAME(void) 23*e018004aSPuranjay Mohan { 24*e018004aSPuranjay Mohan return dup_normal + (dup_discarded != (void *)0); 25*e018004aSPuranjay Mohan } 26