<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def symbols_app(parser, _, args):
 # pragma: no cover """ List ELF symbol table. """


    parser.add_argument('file', help='ELF file to list the symbols of')
    parser.add_argument('symbol', nargs='?', help='show only this symbol')
    parser.add_argument('--exact', '-e', action='store_const', const=True, help='filter by exact symbol name')
    args = parser.parse_args(args)

    print('%-18s %5s %-7s %-7s %-10s %5s %s' % (
        'value',
        'size',
        'type',
        'binding',
        'visibility',
        'index',
        'name',
    ))

    elf = ELF(args.file)
    for symbol in elf.symbols:
        if args.symbol:
            if args.exact:
                if symbol.name != args.symbol:
                    continue
            else:
                if args.symbol.lower() not in symbol.name.lower():
                    continue

        if symbol.shndx == symbol.SpecialSection.undef:
            shndx = 'UND'
        elif symbol.shndx == symbol.SpecialSection.abs:
            shndx = 'ABS'
        elif symbol.shndx == symbol.SpecialSection.common:
            shndx = 'COM'
        else:
            shndx = str(symbol.shndx)

        print('0x%016x %5d %-7s %-7s %-10s %5s %s' % (
            symbol.value,
            symbol.size,
            symbol.type.name,
            symbol.binding.name,
            symbol.visibility.name,
            shndx,
            symbol.name,
        ))