Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Segfault when loading conflicting @ccallable names from multiple pkgimages #54878

Open
topolarity opened this issue Jun 21, 2024 · 0 comments · May be fixed by #55813
Open

Segfault when loading conflicting @ccallable names from multiple pkgimages #54878

topolarity opened this issue Jun 21, 2024 · 0 comments · May be fixed by #55813
Labels
bug Indicates an unexpected problem or unintended behavior

Comments

@topolarity
Copy link
Member

$ cat Foo/src/Foo.jl
module Foo
Base.@ccallable function foo()::Cint
    return 0
end
end
$ cat Bar/src/Bar.jl
module Bar
Base.@ccallable function foo()::Cint
    return 0
end
end

I would have expected ERROR: @ccallable was already defined for this method name, but instead I get:

$ julia +1.10 -q -e "using Foo; using Bar;"

[1660150] signal (11.1): Segmentation fault
in expression starting at none:1
end<llvm::ArrayRef<llvm::SubtargetSubTypeKV> > at /usr/local/x86_64-linux-gnu/include/c++/9.1.0/bits/range_access.h:79 [inlined]
adl_end<const llvm::ArrayRef<llvm::SubtargetSubTypeKV>&> at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/usr/include/llvm/ADT/STLExtras.h:237 [inlined]
adl_end<const llvm::ArrayRef<llvm::SubtargetSubTypeKV>&> at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/usr/include/llvm/ADT/STLExtras.h:257 [inlined]
lower_bound<const llvm::ArrayRef<llvm::SubtargetSubTypeKV>&, llvm::StringRef&> at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/usr/include/llvm/ADT/STLExtras.h:1737 [inlined]
isCPUStringValid at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/usr/include/llvm/MC/MCSubtargetInfo.h:229 [inlined]
createTargetMachine at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/jitlayers.cpp:1082 [inlined]
JuliaOJIT at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/jitlayers.cpp:1429
jl_generate_ccallable at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/codegen.cpp:6789
jl_compile_extern_c_impl at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/jitlayers.cpp:392
jl_compile_extern at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/staticdata.c:2126 [inlined]
jl_reinit_ccallable at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/staticdata.c:2138 [inlined]
jl_restore_package_image_from_stream at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/staticdata.c:3451
jl_restore_incremental_from_buf at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/staticdata.c:3486
ijl_restore_package_image_from_file at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/staticdata.c:3570
_include_from_serialized at ./loading.jl:1058
_require_search_from_serialized at ./loading.jl:1581
_require at ./loading.jl:1938
__require_prelocked at ./loading.jl:1812
jfptr___require_prelocked_80768.1 at /home/topolarity/.julia/juliaup/julia-1.10.4+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_f__call_in_world at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/builtins.c:831
#invoke_in_world#3 at ./essentials.jl:926 [inlined]
invoke_in_world at ./essentials.jl:923 [inlined]
_require_prelocked at ./loading.jl:1803
macro expansion at ./loading.jl:1790 [inlined]
macro expansion at ./lock.jl:267 [inlined]
__require at ./loading.jl:1753
jfptr___require_80733.1 at /home/topolarity/.julia/juliaup/julia-1.10.4+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_f__call_in_world at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/builtins.c:831
#invoke_in_world#3 at ./essentials.jl:926 [inlined]
invoke_in_world at ./essentials.jl:923 [inlined]
require at ./loading.jl:1746
jfptr_require_80730.1 at /home/topolarity/.julia/juliaup/julia-1.10.4+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
call_require at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/toplevel.c:481 [inlined]
eval_import_path at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/toplevel.c:518
jl_toplevel_eval_flex at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/toplevel.c:752
jl_toplevel_eval_flex at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/toplevel.c:877
jl_toplevel_eval_flex at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/toplevel.c:877
ijl_toplevel_eval_in at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/toplevel.c:985
eval at ./boot.jl:385 [inlined]
exec_options at ./client.jl:291
_start at ./client.jl:552
jfptr__start_82729.1 at /home/topolarity/.julia/juliaup/julia-1.10.4+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/gf.c:2895 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/gf.c:3077
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
true_main at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/jlapi.c:582
jl_repl_entrypoint at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/src/jlapi.c:731
main at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-10/cli/loader_exe.c:58
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
unknown function (ip: 0x4010b8)
Allocations: 2908 (Pool: 2899; Big: 9); GC: 0
Segmentation fault

Crashes in Julia 1.10 and 1.11 - working on 1.9

@topolarity topolarity added the bug Indicates an unexpected problem or unintended behavior label Jun 21, 2024
topolarity added a commit to topolarity/julia that referenced this issue Sep 19, 2024
This turns the existing segfault into an error:
```julia
julia> using Foo, Bar
ERROR: @ccallable: symbol 'foo' conflicts with existing symbol
Stacktrace:
  [1] _include_from_serialized(pkg::Base.PkgId, path::String, ocachepath::String, depmods::Vector{…}, ignore_native::Nothing; register::Bool)
    @ Base ./loading.jl:1241
  [2] _include_from_serialized (repeats 2 times)
    @ ./loading.jl:1206 [inlined]
  [3] _require_search_from_serialized(pkg::Base.PkgId, sourcepath::String, build_id::UInt128, stalecheck::Bool; reasons::Dict{…}, DEPOT_PATH::Vector{…})
    @ Base ./loading.jl:2018
  [4] _require(pkg::Base.PkgId, env::String)
    @ Base ./loading.jl:2477
  [5] __require_prelocked(uuidkey::Base.PkgId, env::String)
    @ Base ./loading.jl:2343
  [6] #invoke_in_world#2
    @ ./essentials.jl:1082 [inlined]
  [7] invoke_in_world
    @ ./essentials.jl:1079 [inlined]
  [8] _require_prelocked(uuidkey::Base.PkgId, env::String)
    @ Base ./loading.jl:2330
  [9] macro expansion
    @ ./loading.jl:2269 [inlined]
 [10] macro expansion
    @ ./lock.jl:287 [inlined]
 [11] __require(into::Module, mod::Symbol)
    @ Base ./loading.jl:2226
 [12] #invoke_in_world#2
    @ ./essentials.jl:1082 [inlined]
 [13] invoke_in_world
    @ ./essentials.jl:1079 [inlined]
 [14] require(into::Module, mod::Symbol)
    @ Base ./loading.jl:2219
Some type information was truncated. Use `show(err)` to see complete types.
```

Ideally the loading code would know to anticipate this and display a
better error to the user (w/o the useless stack-trace)

Resolves JuliaLang#54878, although we may wish to make this a warning or provide
an alternative `using` / `import` pathway that can allow `@ccallable`
registration to fail.
topolarity added a commit to topolarity/julia that referenced this issue Sep 19, 2024
This turns the existing segfault into an error:
```julia
julia> using Foo, Bar
ERROR: @ccallable: symbol 'foo' conflicts with existing symbol
Stacktrace:
  [1] _include_from_serialized(pkg::Base.PkgId, path::String, ocachepath::String, depmods::Vector{…}, ignore_native::Nothing; register::Bool)
    @ Base ./loading.jl:1241
  [2] _include_from_serialized (repeats 2 times)
    @ ./loading.jl:1206 [inlined]
  [3] _require_search_from_serialized(pkg::Base.PkgId, sourcepath::String, build_id::UInt128, stalecheck::Bool; reasons::Dict{…}, DEPOT_PATH::Vector{…})
    @ Base ./loading.jl:2018
  [4] _require(pkg::Base.PkgId, env::String)
    @ Base ./loading.jl:2477
  [5] __require_prelocked(uuidkey::Base.PkgId, env::String)
    @ Base ./loading.jl:2343
  [6] #invoke_in_world#2
    @ ./essentials.jl:1082 [inlined]
  [7] invoke_in_world
    @ ./essentials.jl:1079 [inlined]
  [8] _require_prelocked(uuidkey::Base.PkgId, env::String)
    @ Base ./loading.jl:2330
  [9] macro expansion
    @ ./loading.jl:2269 [inlined]
 [10] macro expansion
    @ ./lock.jl:287 [inlined]
 [11] __require(into::Module, mod::Symbol)
    @ Base ./loading.jl:2226
 [12] #invoke_in_world#2
    @ ./essentials.jl:1082 [inlined]
 [13] invoke_in_world
    @ ./essentials.jl:1079 [inlined]
 [14] require(into::Module, mod::Symbol)
    @ Base ./loading.jl:2219
Some type information was truncated. Use `show(err)` to see complete types.
```

Ideally the loading code would know to anticipate this and display a
better error to the user (w/o the useless stack-trace)

Resolves JuliaLang#54878, although we may wish to make this a warning or provide
an alternative `using` / `import` pathway that can allow `@ccallable`
registration to fail.
topolarity added a commit to topolarity/julia that referenced this issue Sep 19, 2024
This turns the existing segfault into a warning, as on 1.9:
```julia
julia> using Foo, Bar
WARNING: @ccallable was already defined for this method name
```

Resolves JuliaLang#54878
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Indicates an unexpected problem or unintended behavior
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant