lkml.org 
[lkml]   [2022]   [Feb]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v10 02/15] livepatch: avoid position-based search if `-z unique-symbol` is available
    On Mon, Feb 14, 2022 at 10:10:00AM -0800, Josh Poimboeuf wrote:
    > On Mon, Feb 14, 2022 at 01:24:33PM +0100, Alexander Lobakin wrote:
    > > > One idea I mentioned before, it may be worth exploring changing the "F"
    > > > in FGKASLR to "File" instead of "Function". In other words, only
    > > > shuffle at an object-file granularity. Then, even with duplicates, the
    > > > <file+function> symbol pair doesn't change in the symbol table. And as
    > > > a bonus, it should help FGKASLR i-cache performance, significantly.
    > >
    > > Yeah, I keep that in mind. However, this wouldn't solve the
    > > duplicate static function names problem, right?
    > > Let's say you have a static function f() in file1 and f() in file2,
    > > then the layout each boot can be
    > >
    > > .text.file1 or .text.file2
    > > f() f()
    > > .text.file2 .text.file1
    > > f() f()
    > >
    > > and position-based search won't work anyway, right?
    >
    > Right, so we'd have to abandon position-based search in favor of
    > file+func based search.
    >
    > It's not perfect because there are still a few file+func duplicates.
    > But it might be good enough. We would presumably just refuse to patch a
    > duplicate. Or we could remove them (and enforce their continued removal
    > with tooling-based warnings).
    >

    You're talking about duplicate file+func combinations as stored in the
    symbol table?

    From a recent rhel-9 development kernel:

    $ readelf --wide --symbols vmlinux | \
    awk '$4=="FILE" { f=$NF } $4=="OBJECT" || $4=="FUNC" { print $4 " " f "::" $NF }' | \
    sort | uniq -c | sort -n | awk '$1 != 1'

    2 FUNC bus.c::new_id_store
    2 FUNC core.c::native_read_msr
    2 FUNC core.c::type_show
    2 FUNC diag.c::sk_diag_fill.constprop.0
    2 FUNC hid-core.c::hid_exit
    2 FUNC hid-core.c::hid_init
    2 FUNC inode.c::remove_one
    2 FUNC iommu.c::__list_del_entry
    2 FUNC msr.c::msr_init
    2 FUNC msr.c::msr_read
    2 FUNC proc.c::c_next
    2 FUNC proc.c::c_start
    2 FUNC proc.c::c_stop
    2 FUNC raw.c::copy_overflow
    2 FUNC raw.c::dst_output
    2 FUNC route.c::dst_discard
    2 FUNC sysfs.c::name_show
    2 FUNC udp.c::copy_overflow
    2 FUNC udp.c::udp_lib_close
    2 FUNC udp.c::udp_lib_hash
    2 FUNC udp.c::udplite_getfrag
    2 FUNC udplite.c::udp_lib_close
    2 FUNC udplite.c::udp_lib_hash
    2 FUNC udplite.c::udplite_sk_init
    2 OBJECT acpi.c::__func__.0
    2 OBJECT amd.c::__already_done.10
    2 OBJECT amd.c::__func__.4
    2 OBJECT amd.c::__func__.5
    2 OBJECT bus.c::driver_attr_new_id
    2 OBJECT bus.c::__func__.1
    2 OBJECT bus.c::__func__.2
    2 OBJECT bus.c::__func__.3
    2 OBJECT bus.c::__func__.4
    2 OBJECT bus.c::__func__.5
    2 OBJECT bus.c::__func__.6
    2 OBJECT bus.c::__func__.7
    2 OBJECT bus.c::__func__.8
    2 OBJECT bus.c::__func__.9
    2 OBJECT cgroup.c::__func__.0
    2 OBJECT class.c::__func__.0
    2 OBJECT class.c::__func__.1
    2 OBJECT class.c::__func__.3
    2 OBJECT class.c::__func__.5
    2 OBJECT class.c::__key.0
    2 OBJECT class.c::__key.1
    2 OBJECT class.c::__key.4
    2 OBJECT core.c::__already_done.18
    2 OBJECT core.c::__already_done.19
    2 OBJECT core.c::__already_done.3
    2 OBJECT core.c::dev_attr_size
    2 OBJECT core.c::dev_attr_start
    2 OBJECT core.c::dev_attr_type
    2 OBJECT core.c::empty_attrs
    2 OBJECT core.c::__func__.10
    2 OBJECT core.c::__func__.14
    2 OBJECT core.c::__func__.7
    2 OBJECT core.c::__func__.9
    2 OBJECT core.c::__key.0
    2 OBJECT core.c::__key.2
    2 OBJECT core.c::__key.3
    2 OBJECT dev.c::__func__.0
    2 OBJECT dir.c::__func__.3
    2 OBJECT driver.c::__func__.0
    2 OBJECT fib_rules.c::__msg.0
    2 OBJECT file.c::__func__.2
    2 OBJECT file.c::__key.1
    2 OBJECT file.c::__key.2
    2 OBJECT hpet.c::__func__.4
    2 OBJECT icmp.c::__func__.1
    2 OBJECT inode.c::__func__.1
    2 OBJECT inode.c::__func__.3
    2 OBJECT intel.c::__already_done.10
    2 OBJECT intel.c::__already_done.11
    2 OBJECT intel.c::__already_done.13
    2 OBJECT ioctl.c::__func__.0
    2 OBJECT iommu.c::__already_done.15
    2 OBJECT iommu.c::__func__.10
    2 OBJECT iommu.c::__func__.2
    2 OBJECT iommu.c::_rs.13
    2 OBJECT iommu.c::_rs.5
    2 OBJECT iommu.c::_rs.9
    2 OBJECT irq.c::__func__.0
    2 OBJECT irq.c::__func__.2
    2 OBJECT irqdomain.c::__func__.0
    2 OBJECT irqdomain.c::__func__.1
    2 OBJECT irqdomain.c::__func__.3
    2 OBJECT main.c::__func__.10
    2 OBJECT main.c::__func__.11
    2 OBJECT main.c::__func__.3
    2 OBJECT main.c::__func__.4
    2 OBJECT main.c::__func__.5
    2 OBJECT manage.c::__func__.1
    2 OBJECT mount.c::__func__.0
    2 OBJECT msr.c::__func__.0
    2 OBJECT ping.c::__func__.1
    2 OBJECT property.c::__func__.3
    2 OBJECT qos.c::__func__.0
    2 OBJECT qos.c::__func__.2
    2 OBJECT resource.c::__func__.1
    2 OBJECT route.c::__key.0
    2 OBJECT route.c::__msg.1
    2 OBJECT route.c::__msg.2
    2 OBJECT route.c::__msg.3
    2 OBJECT route.c::__msg.4
    2 OBJECT route.c::__msg.5
    2 OBJECT route.c::__msg.6
    2 OBJECT swap.c::__func__.0
    2 OBJECT syncookies.c::___done.1
    2 OBJECT syncookies.c::msstab
    2 OBJECT syncookies.c::___once_key.2
    2 OBJECT sysfs.c::dev_attr_name
    2 OBJECT sysfs.c::__key.1
    2 OBJECT sysfs.c::power_attrs
    2 OBJECT udp.c::descriptor.12
    2 OBJECT udp.c::descriptor.13
    2 OBJECT udp.c::__func__.2
    2 OBJECT udp.c::__func__.3
    2 OBJECT udp.c::__func__.4
    2 OBJECT utils.c::__func__.5
    3 FUNC core.c::cmask_show
    3 FUNC core.c::edge_show
    3 FUNC core.c::event_show
    3 FUNC core.c::inv_show
    3 FUNC core.c::umask_show
    3 FUNC inode.c::init_once
    3 OBJECT acpi.c::__func__.1
    3 OBJECT core.c::format_attr_cmask
    3 OBJECT core.c::format_attr_edge
    3 OBJECT core.c::format_attr_event
    3 OBJECT core.c::format_attr_inv
    3 OBJECT core.c::format_attr_umask
    3 OBJECT core.c::__func__.6
    3 OBJECT core.c::__func__.8
    3 OBJECT file.c::__key.3
    3 OBJECT generic.c::__func__.0
    3 OBJECT iommu.c::__func__.0
    3 OBJECT iommu.c::__func__.1
    3 OBJECT iommu.c::__func__.8
    3 OBJECT main.c::__func__.0
    3 OBJECT main.c::__func__.1
    3 OBJECT main.c::__func__.6
    3 OBJECT quirks.c::__func__.0
    3 OBJECT sysfs.c::__func__.0
    4 OBJECT core.c::__func__.4
    5 OBJECT inode.c::tokens
    6 OBJECT core.c::__func__.3
    6 OBJECT core.c::__func__.5
    7 OBJECT core.c::__func__.1
    8 OBJECT core.c::__func__.0
    8 OBJECT core.c::__func__.2

    We could probably minimize the FUNC duplicates with unique names, but
    I'm not as optimistic about the OBJECTs as most are created via macros
    like __already_done.X. Unless clever macro magic?

    Next question: what are the odds that these entries, at least the ones
    we can't easily rename, need disambiguity for livepatching? or
    kpatch-build for related purposes?

    -- Joe

    \
     
     \ /
      Last update: 2022-02-16 21:33    [W:4.059 / U:0.832 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site