https://sourceware.org/bugzilla/show_bug.cgi?id=33260

            Bug ID: 33260
           Summary: ld should emit relative relocations for defined,
                    protected symbols
           Product: binutils
           Version: unspecified
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: ld
          Assignee: unassigned at sourceware dot org
          Reporter: thiago at kde dot org
  Target Milestone: ---

ld is currently emitting relocations by name for addresses of protected symbols
defined in this library, which is unnecessary, as the symbols cannot be
interposed. This is related to a number of previous copy-relocation problems,
but different, because it happens on stored addresses, not calls from code.

Testcase:

$ cat a.c
#ifdef USE_PROTECTED
#  define EXPORT __attribute__((visibility("protected")))
#else
#  define EXPORT __attribute__((visibility("default")))
#endif
#define EXPORT_OVERRIDABLE __attribute__((visibility("default"), weak))

EXPORT void my_func() {}
EXPORT_OVERRIDABLE void my_func_overridable() {}

$ cat b.c
#ifdef USE_PROTECTED
#  define EXPORT __attribute__((visibility("protected")))
#else
#  define EXPORT __attribute__((visibility("default")))
#endif
#define EXPORT_OVERRIDABLE __attribute__((visibility("default"), weak))

EXPORT void my_func(void);
EXPORT_OVERRIDABLE void my_func_overridable(void);

static void (*vtable[])(void) = {
    &my_func, &my_func_overridable
};
void *f() { my_func(); return vtable; }

$ cc -fPIC -DUSE_PROTECTED -O2 -fvisibility=hidden -mno-direct-extern-access
-shared -o a.so a.c b.c

The relocations emitted are:

$ eu-readelf --dyn-syms a.so 
Symbol table [ 3] '.dynsym' contains 7 entries:
 1 local symbol  String table: [ 4] '.dynstr'
  Num:            Value   Size Type    Bind   Vis          Ndx Name
    0: 0000000000000000      0 NOTYPE  LOCAL  DEFAULT    UNDEF 
    1: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF
_ITM_deregisterTMCloneTable
    2: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF __gmon_start__
    3: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF
_ITM_registerTMCloneTable
    4: 0000000000000000      0 FUNC    WEAK   DEFAULT    UNDEF
__cxa_finalize@GLIBC_2.2.5 (2)
    5: 0000000000001100      1 FUNC    GLOBAL PROTECTED     11 my_func
    6: 0000000000001110      1 FUNC    WEAK   DEFAULT       11
my_func_overridable

$ objdump -R a.so
DYNAMIC RELOCATION RECORDS
OFFSET           TYPE              VALUE
0000000000003e18 R_X86_64_RELATIVE  *ABS*+0x00000000000010f0
0000000000003e20 R_X86_64_RELATIVE  *ABS*+0x00000000000010b0
0000000000004000 R_X86_64_RELATIVE  *ABS*+0x0000000000004000
0000000000003fc8 R_X86_64_GLOB_DAT  _ITM_deregisterTMCloneTable@Base
0000000000003fd0 R_X86_64_GLOB_DAT  __gmon_start__@Base
0000000000003fd8 R_X86_64_GLOB_DAT  _ITM_registerTMCloneTable@Base
0000000000003fe0 R_X86_64_GLOB_DAT  __cxa_finalize@GLIBC_2.2.5
0000000000004010 R_X86_64_64       my_func@@Base
0000000000004018 R_X86_64_64       my_func_overridable@@Base

The two R_X86_64_64 relocations at the end correspond to the vtable array: the
entry for the "my_func" should have been a R_X86_64_RELATIVE because the symbol
is protected.

Note how the call to it was resolved without the need for a relocation:

$ objdump -d a.so | sed -n '/<f>/,/^$/p'
0000000000001120 <f>:
    1120:       48 83 ec 08             sub    $0x8,%rsp
    1124:       e8 d7 ff ff ff          call   1100 <my_func>
    1129:       48 8d 05 e0 2e 00 00    lea    0x2ee0(%rip),%rax        # 4010
<my_func@@Base+0x2f10>
    1130:       48 83 c4 08             add    $0x8,%rsp
    1134:       c3                      ret

-- 
You are receiving this mail because:
You are on the CC list for the bug.

Reply via email to