Fix syscalls in the C SDK failing at runtime when compiled as C++ (#17124)

Some syscalls are wrongly declared "static" in solana_sdk.h, which makes clang++ assume they are local to the compilation unit. It therefore ignores the extern "C" {} block and mangles their names. While that doesn't break C++ compilation, the syscall fails at runtime with something along the lines of "ELF error: Unresolved symbol (_ZL26sol_create_program_addressPK13SolSignerSeediPK9SolPubkeyS4_)".
This commit is contained in:
Christian Machacek 2021-05-08 18:31:50 +02:00 committed by GitHub
parent 0a6fa1999a
commit 6927d0c77e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 14 additions and 11 deletions

View File

@ -431,7 +431,7 @@ typedef struct {
* @param bytes_len Number of byte arrays * @param bytes_len Number of byte arrays
* @param result 32 byte array to hold the result * @param result 32 byte array to hold the result
*/ */
static uint64_t sol_sha256( uint64_t sol_sha256(
const SolBytes *bytes, const SolBytes *bytes,
int bytes_len, int bytes_len,
const uint8_t *result const uint8_t *result
@ -482,7 +482,7 @@ typedef struct {
* @param program_id Program id of the signer * @param program_id Program id of the signer
* @param program_address Program address created, filled on return * @param program_address Program address created, filled on return
*/ */
static uint64_t sol_create_program_address( uint64_t sol_create_program_address(
const SolSignerSeed *seeds, const SolSignerSeed *seeds,
int seeds_len, int seeds_len,
const SolPubkey *program_id, const SolPubkey *program_id,
@ -498,7 +498,7 @@ static uint64_t sol_create_program_address(
* @param program_address Program address created, filled on return * @param program_address Program address created, filled on return
* @param bump_seed Bump seed required to create a valid program address * @param bump_seed Bump seed required to create a valid program address
*/ */
static uint64_t sol_try_find_program_address( uint64_t sol_try_find_program_address(
const SolSignerSeed *seeds, const SolSignerSeed *seeds,
int seeds_len, int seeds_len,
const SolPubkey *program_id, const SolPubkey *program_id,
@ -511,6 +511,17 @@ static uint64_t sol_try_find_program_address(
* * @{ * * @{
*/ */
/**
* Internal cross-program invocation function
*/
uint64_t sol_invoke_signed_c(
const SolInstruction *instruction,
const SolAccountInfo *account_infos,
int account_infos_len,
const SolSignerSeeds *signers_seeds,
int signers_seeds_len
);
/** /**
* Invoke another program and sign for some of the keys * Invoke another program and sign for some of the keys
* *
@ -527,14 +538,6 @@ static uint64_t sol_invoke_signed(
const SolSignerSeeds *signers_seeds, const SolSignerSeeds *signers_seeds,
int signers_seeds_len int signers_seeds_len
) { ) {
uint64_t sol_invoke_signed_c(
const SolInstruction *instruction,
const SolAccountInfo *account_infos,
int account_infos_len,
const SolSignerSeeds *signers_seeds,
int signers_seeds_len
);
return sol_invoke_signed_c( return sol_invoke_signed_c(
instruction, instruction,
account_infos, account_infos,